同步发布顺序

GET*_*Tah 11 java synchronized

我扫描了所有关于这个问题的答案的java 文档synchronized,没有运气.

说我有thread1,thread2,thread3试图在同一时间运行下面的代码.

 synchronized(lockObj) { 
     doSomething();
 }
Run Code Online (Sandbox Code Playgroud)

假设thread1先获取doSomething(),thread2然后thread3阻止并等待该synchronized语句.

  1. thread1释放锁时,哪个线程将首先释放?
  2. 释放锁时适用的一般订单规则是什么?

bot*_*ius 21

1. thread2或thread3.无法保证:

同样,不应假设线程被授予监视器所有权的顺序或线程响应notify或notifyAll方法唤醒的顺序

http://docs.oracle.com/javase/1.5.0/docs/guide/vm/thread-priorities.html#general

2. Java监视器(synchronized/await/notify/notifyAll)是不公平的.来自java 1.5的同步原语通常具有强制公平性的参数.请注意,公平版本会有相当大的性能损失,通常应该使用非公平版本:从统计上来说,即使订单没有严格执行,每个线程也都有机会运行.

使用由许多线程访问的公平锁的程序可能比使用默认设置的程序显示更低的总吞吐量(即,更慢;通常慢得多),但是获得锁定的时间差异较小并且保证缺乏饥饿.但请注意,锁的公平性并不能保证线程调度的公平性.因此,使用公平锁定的许多线程中的一个可以连续多次获得它,而其他活动线程没有进展并且当前没有保持锁定.另请注意,不定时的tryLock方法不符合公平性设置.即使其他线程正在等待,如果锁可用,它也会成功.

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReentrantLock.html#ReentrantLock%28boolean%29