如果使用从多个线程访问的单例,并且单例本身是线程安全的,那么访问单例时哪个线程会阻塞?
例如认为有一个主线程 A 。A 首先访问了单例 S。然后执行其他操作。
稍后线程 B 访问单例 S。
如果 B 访问 S,单例是否仍然在线程 A 的上下文中,并且还会阻塞线程 A 或仅阻塞线程 B(以及其他试图实际访问它的线程?)
-> accesses
A->S {}
A->X {}
B->S {
...
C-S
} - will B only block C or also A?
回答问题:线程安全单例(精简):
private static volatile Singleton instance;
private static object _sync = new Object();
private Singleton() {
// dosomething...
}
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (_sync)
{
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
(并导致锁定方法)
这个问题主要针对以下几点:我知道锁会阻止多个线程访问同一代码区域。我的问题具体到以下几点:
如果产生Singleton的作用域的原始线程没有持有锁,那么如果另一个线程访问该锁,它是否也会被阻塞,因为在该作用域中创建了Singleton Instance?单例只会在原始线程的范围内运行吗?