Java 中的 synchronized 同步块是可重入的。如果一个线程已经拥有了一个管程对象上的锁,那么它就有权访问被这个管程对象同步的所有代码块。当前的判断条件是只有当 isLocked 为 false 时 lock 操作才被允许,而没有考虑是哪个线程锁住了它。在 unlock()调用没有达到对应 lock()调用的次数之前,我们不希望锁被解除。Java 的 synchronized 块并不保证尝试进入它们的线程的顺序。这种情况被称作线程饥饿。为了避免这种问题,锁需要实现公平性。这样可以保证这个锁对象可以被解锁以便其它线程能继续对其加锁。
暂无评论