java - 同步列表时的操作顺序

标签 java multithreading synchronization

我想了解 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/

相关文章:

java - Java 同步方法

java - 缓存空间查询

java - FIndbug 未识别空指针异常

java - 在 ForkJoinpool 上使用 CompletableFuture 并避免线程等待

c++ - C++ 中线程所做的更改

synchronization - SymmetricDS 同步未完美同步

java - Java 8 中意外的并行流性能

java - Spring 3+。通过占位符中的前缀解析属性

c++ - 从许多其他线程中触发一个线程

video - XNA可变音频速度