我在线程1中有以下代码:

synchronized (queues.get(currentQueue)) {            //line 1
   queues.get(currentQueue).add(networkEvent);       //line 2
}

以及线程2中的以下内容:
synchronized (queues.get(currentQueue)) {
   if (queues.get(currentQueue).size() > 10) {
      currentQueue = 1;
   }
}

现在我的问题是:currentQueue变量当前的值为0。当线程2将currentQueue的值更改为1,并且线程1在第1行等待(由于已同步)时,线程1会在行中使用更新后的currentQueue值吗?线程2完成后的2(这就是我想要的)。

最佳答案

这个问题的答案取决于它。我假设还有其他代码块可以增加currentQueue变量。在这种情况下,锁定不会发生在'currentQueue'变量上,也不会发生在'queue'的集合上,而是发生在'队列的集合。

因此,如果两个线程碰巧都访问相同的队列(例如队列5),那么您问题的答案是肯定的。但是,发生这种情况的可能性是十分之一(十分之一的机会,其中x =“队列”集合中的数目或队列)。因此,如果线程访问不同的队列,那么答案是否定的。

09-28 02:06