同步块是否保持 FIFO 运行 顺序,两个块是否可以重新排序?
Does Synchronized Blocks maintain FIFO run order and can two blocks be reordered?
第一题很简单
说Java 运行time遇到了三个同一个锁的synchronized块
它首先看到第一个块并抢到锁,同时运行宁它首先遇到块二和接下来的块三,但都未能获得锁。
现在块一完成并释放了锁,那么这是否保证块二将是第一个获取锁并首先执行的块,因为它试图在块三之前获取锁?
接下来,假设我们有一个具有两个同步块的方法。是否有可能将块 2 之前的块 1 重新排序为块 2 之后的 运行?
如果他们共享同一个锁,我猜答案是否定的,但这可能是错误的。另外,如果他们不共享同一个锁怎么办?
同步块不提供公平性保证,这意味着如果线程 A 获得锁,然后线程 B 和 C 正在等待同一个锁,则无法保证当线程 A 释放锁时它们中的哪一个将首先获得锁。
JIT 编译器也可以决定合并使用相同锁对象的相邻同步块。如果没有其他线程会像这样使用它,JIT 也可以删除同步
synchronized (new Object()) {}
第一题很简单
说Java 运行time遇到了三个同一个锁的synchronized块
它首先看到第一个块并抢到锁,同时运行宁它首先遇到块二和接下来的块三,但都未能获得锁。
现在块一完成并释放了锁,那么这是否保证块二将是第一个获取锁并首先执行的块,因为它试图在块三之前获取锁?
接下来,假设我们有一个具有两个同步块的方法。是否有可能将块 2 之前的块 1 重新排序为块 2 之后的 运行?
如果他们共享同一个锁,我猜答案是否定的,但这可能是错误的。另外,如果他们不共享同一个锁怎么办?
同步块不提供公平性保证,这意味着如果线程 A 获得锁,然后线程 B 和 C 正在等待同一个锁,则无法保证当线程 A 释放锁时它们中的哪一个将首先获得锁。 JIT 编译器也可以决定合并使用相同锁对象的相邻同步块。如果没有其他线程会像这样使用它,JIT 也可以删除同步
synchronized (new Object()) {}