同步发布顺序
我扫描了synchronized
语句中的所有java 文档 ,寻找这个问题的答案而没有运气。
假设我有thread1
, thread2
, thread3
尝试同时运行以下代码。
synchronized(lockObj) { doSomething(); }
假设thread1
首先获取doSomething()
, thread2
然后thread3
,它将阻塞并等待synchronized
语句。
题
- 当
thread1
释放锁时,哪个线程将首先释放? - 释放锁时适用的一般订单规则是什么?
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的同步原语通常具有强制公平性的参数。 请注意,公平版本会有相当大的性能损失,通常应该使用非公平版本:从统计上来说,即使订单没有严格执行,每个线程也都有机会运行。
使用由许multithreading访问的公平锁的程序可能比使用默认设置的程序显示更低的总吞吐量(即,更慢;通常慢得多),但是获得锁的时间差异较小并且保证缺乏饥饿。 但请注意,锁的公平性并不能保证线程调度的公平性。 因此,使用公平锁的许multithreading中的一个可以连续多次获得它,而其他活动线程没有进展并且当前没有持有锁。 另请注意,不定时的tryLock方法不符合公平性设置。 即使其他线程正在等待,如果锁可用,它也会成功。