同步块是否保持FIFO运行顺序,是否可以重新排序两个块?

时间:2018-01-06 03:59:57

标签: java multithreading concurrency synchronization synchronized

第一个问题很简单。

假设Java运行时遇到了三个具有相同锁定的同步块。

它首先看到bloc并抓住锁,同时它正在运行它遇到第一个块和第二个块然后两个都无法获得锁定。

现在阻止一个完成并释放锁定这样做是否保证第二个块将是获取锁定并首先执行的一个,因为它试图在第三个块之前抓住锁定?

接下来,假设我们有一个具有两个同步块的方法。块2之前的块1是否可能被重新排序以在块2之后运行?

如果他们共享相同的锁,我猜测答案是否定的,但这可能是错误的。如果他们不共享同一个锁也会怎么样?

1 个答案:

答案 0 :(得分:1)

synchronized块不提供公平性保证,这意味着如果线程A获得锁定,然后线程B和C正在等待相同的锁定,则无法保证当线程A释放它时它们中的哪一个将首先获得锁定。 此外,JIT编译器可以决定合并使用相同锁定对象的相邻同步块。如果其他线程没有像这样使用它,JIT也可以删除同步

synchronized (new Object()) {}

https://www.ibm.com/developerworks/java/library/j-jtp10185/