我使用grails Web框架开发了Web应用程序,并且正在为我的电子商务平台开发它,该平台为用户提供"闪购"等优惠。
我已经在我的一个控制器中成功为此创建了 api,我正在预订该产品。这里的逻辑是If that product is completely sold and is not available i.e in other words if i have 0 products remaining then i shouldn't book the product and should tell the booking user about this, for this am returning status code as 204
.
这里困扰我的困惑是,What if many customers starts booking the product exactly at the same time altogether. Scenario lets say i have only 20 pieces of product to be sold and 21 customers started booking the product at the same time
.为此,我将逐个锁定/处理 api 请求(排队(。我不知道该怎么做,请帮助我。
你有没有在 Java 中使用过 synchronized
关键字?它用于形成线程队列,其中线程将形成一行来访问特定的代码段。为了确定线程是否应该等待,您将一个对象实例传递给同步块,如果在同一实例上已经有另一个线程使用相同的块,它将等待,直到所有先前的线程完成。本文介绍了同步:https://www.geeksforgeeks.org/synchronized-in-java/的用法。
另外,这里有一个例子来说明我的意思。我将只使用一个静态对象实例,这意味着所有线程都将使用相同的对象实例,这将使它们都等待轮到它们:
static Object threadLock = new Object();
void doSomething() {
// region Some code that all threads can execute at once
...
// endregion
// region Synchronized code
synchronized(threadLock) {
// Have your winner logic here. Threads will only go into this block in a first-come-first-served basis.
}
// endregion
}
为了简单起见,还可以将整个方法标记为同步,但是当可能不需要时,该方法中的所有逻辑都必须以同步方式完成。自行决定使用任一方法。