【问题标题】:Thread synch and singleton questions线程同步和单例问题
【发布时间】:2015-05-02 12:57:41
【问题描述】:
首先我需要清除一些基本的东西,假设我有一个同步块或一个同步方法,一个线程已经进入同步部分并且 5 个新线程尝试访问同步部分,它们会停止运行直到第一个线程离开同步部分?如果他们这样做了,他们会在优先队列中等待吗?
第二个问题是关于显示器的,假设我有以下代码:
synchronized(someObject){
//do some stuff
someObject.wait();
}
假设如果一个线程运行此代码而另一个线程在监视器上等待然后第一个线程调用等待,第二个线程将进入代码块(即等待释放someObject 的监视器)是否正确?
最后一个问题是关于单例实现的,为了使其线程安全,是否足以同步单例类中的实例化行以确保它不会被多次调用?如果是这样,这是最佳做法吗?
【问题讨论】:
标签:
java
multithreading
synchronization
locking
singleton
【解决方案1】:
首先我需要清除一些基本的东西,假设我有一个同步块或一个同步方法,一个线程已经进入同步部分并且 5 个新线程尝试访问同步部分,它们会停止运行直到第一个线程离开同步部分?如果他们这样做了,他们会在优先队列中等待吗?
如果一个线程在监视器上有一个锁,其他线程就不能在同一个对象上获得相同的锁。因此,他们将被阻止。一旦当前线程放弃了它的锁,另一个线程就可以获取锁。在优先级方面,即使一个线程的优先级高于另一个,也不能保证高优先级的线程会先于低优先级的线程运行。
ReentrantLock 类构造函数提供了创建公平锁或非公平锁的可能性。在公平的场景中,线程按照它们请求的顺序获取对象上的锁。在不公平的情况下,允许插入请求,其中一个请求可能会将自己插入请求队列的更高位置。
第二个问题是关于显示器的,假设我有以下代码:
synchronized(someObject){
//do some stuff
someObject.wait();
}
假设如果一个线程运行这段代码,而另一个线程在监视器上等待,然后第一个线程调用等待,第二个线程将进入代码块(即等待释放 someObject 的监视器)是否正确?
当当前线程调用wait时,当前线程将释放它在对象上的所有锁。一旦该锁被释放,其他线程可能会尝试在同一对象上获取相同的锁。
最后一个问题是关于单例实现的,为了使其线程安全,是否足以同步单例类中的实例化行以确保它不会被多次调用?如果是这样,这是最佳做法吗?
请参阅this 关于线程安全单例类的帖子。