繁体   English   中英

线程同步和单例问题

[英]Thread synch and singleton questions

首先,我需要清除一些基本知识,假设我有一个同步块或一个同步方法,并且一个线程已经进入同步部分,并且有5个新线程尝试访问该同步部分,它们将停止运行,直到第一个线程离开同步部分。 ? 如果这样做,他们是否会在优先队列中等待?

第二个问题是关于监视器的,假设我有以下代码:
synchronized(someObject){ //do some stuff someObject.wait(); } synchronized(someObject){ //do some stuff someObject.wait(); }它是正确的假设,如果一个线程运行这段代码,而另一个线程正在等待监视器上,然后第一个线程调用wait,第二个线程将进入代码块(即等待释放someObject的显示器)?

最后一个问题是关于Singleton实现,为了使其具有线程安全性,是否足以同步singleton类内的实例化行以确保它不会被多次调用? 如果是这样,这是最佳做法吗?

首先,我需要清除一些基本知识,假设我有一个同步块或一个同步方法,并且一个线程已经进入同步部分,并且有5个新线程尝试访问该同步部分,它们将停止运行,直到第一个线程离开同步部分。 ? 如果这样做,他们是否会在优先队列中等待?

如果一个线程在监视器上具有锁,则其他线程无法在同一对象上获得相同的锁。 因此,它们将被阻止。 一旦当前线程放弃了它的锁,另一个线程就可以获取该锁。 就优先级而言,即使一个线程的优先级高于另一个线程,也无法保证更高优先级的线程将在较低优先级的线程之前运行。

ReentrantLock类构造函数提供了创建公平锁或非公平锁的可能性。 在公平的情况下,线程按请求的顺序获取对象上的锁。 在不公平的情况下,允许对请求进行插入,其中一个请求可能会将自身插入更高的请求队列。

第二个问题是关于监视器的,假设我有以下代码:

synchronized(someObject){
        //do some stuff
        someObject.wait();
}

假设一个线程在另一个线程正在监视器上等待时运行此代码,然后第一个线程等待,那么第二个线程将进入代码块(即,该等待释放someObject的监视器)是否正确?

当前线程调用wait时,当前线程将释放它对该对象的所有锁。 释放该锁后,其他线程可能会尝试在同一对象上获取相同的锁。

最后一个问题是关于Singleton实现,为了使其具有线程安全性,是否足以同步singleton类内的实例化行以确保它不会被多次调用? 如果是这样,这是最佳做法吗?

有关线程安全单例类的信息,请参见这篇文章。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM