我在synchronized
语句中扫描了所有java documentation,但没有运气,正在寻找这个问题的答案。
假设我thread1
,thread2
,thread3
尝试同时运行以下代码。
synchronized(lockObj) {
doSomething();
}
假设thread1
先到doSomething()
,thread2
然后thread3
,它将阻止并等待synchronized
语句。
问题
thread1
释放锁时,哪个线程将首先被释放? 答案 0 :(得分: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