我想了解 Java 在同步列表时究竟是如何工作的。 让我们假设我有这段代码:
List list = Collections.synchronizedList(new ArrayList());
synchronized(list) {
Iterator i = list.iterator();
while (i.hasNext())
foo(i.next());
}
并且一个线程(线程 1)正在执行它。
另一个线程(线程 2)使:
list.add(....)
当前面的代码正在线程1中执行时
线程 2 会等到线程 1 完成该代码吗?同步就像“等待另一个完成”?
或者,例如,如果 3 个线程到达一些由 synchronized(list) {}
包装的代码,它们是否会仅按顺序启动它而不是同时启动?
最佳答案
Will thread 2 wait until thread 1 finishes that code?, ie, syncronzying is like "waiting for the other one to finish"?
是如果某个线程获得了锁,那么在初始线程释放锁之前,其他线程无法获得相同的锁。
Or, for example, if 3 threads reach some code wrapped by synchronized(list) {}, will they start it only by order but never simultaneously?
是的,按顺序,但未指定顺序。从您的角度来看,它可能是首先获取它的 3 个线程中的任何一个。
P.S. Mutex 获取(同步)没有任何公平性。未指定哪个线程以及何时获取锁。 例如:如果您有线程 A 持有锁,并且有其他 3 个线程在等待同一个锁,并且线程 A 在一段时间后释放了锁;然后 任何 4 个线程(包括线程 A)都可以获取该锁
关于java - 同步列表时的操作顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22381153/