java线程同步和单例问题
首先,我需要清除一些基本的东西,假设我有一个同步块或同步方法,一个线程已经进入同步部分,5个新线程尝试访问同步部分,它们会停止运行,直到第一个线程离开同步部分吗?如果他们这样做了,他们会按优先顺序排队吗
第二个问题是关于监视器,假设我有以下代码:
synchronized(someObject){
//do some stuff
someObject.wait();
}
假设一个线程在另一个线程在监视器上等待时运行此代码,然后第一个线程调用wait,那么第二个线程将进入代码块(即wait释放someObject
的监视器),这是否正确
最后一个问题是关于单例实现,为了保证线程安全,同步单例类中的实例化行以确保它不会被多次调用是否足够?如果是这样,这是最佳实践吗
# 1 楼答案
如果一个线程在监视器上有锁,那么其他线程无法在同一对象上获得相同的锁。因此,他们将被封锁。一旦当前线程放弃了锁,另一个线程就可以获得锁。就优先级而言,即使一个线程的优先级高于另一个线程,也不能保证优先级较高的线程会在优先级较低的线程之前运行
ReentrantLock类构造函数提供了创建公平锁或非公平锁的可能性。在公平场景中,线程按照请求的顺序获取对象上的锁。在不公平的情况下,允许请求的转发,其中一个请求可能会在请求队列的更高位置上转发
当当前线程调用wait时,当前线程将释放它对对象的所有锁。一旦释放该锁,其他线程可能会尝试在同一对象上获取相同的锁
请参阅this关于线程安全的单例类的帖子