我已经使用grails Web框架开发了Web应用程序,并且正在为我的电子商务平台开发此应用程序,在该平台上向诸如“ Flash Sale”之类的用户提供报价。
我已经在预订产品的我的控制器之一中成功为此创建了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请求。尚不知道如何执行此操作,请帮帮我。
答案 0 :(得分:0)
您是否曾经在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
}
为简单起见,您也可以将整个方法标记为已同步,但是当不需要时,必须以同步方式完成方法中的所有逻辑。您可以自行决定使用哪种方法。