问题1:为什么在单例模式的多线程中我们需要两个null检查?如果我们仅使用外部支票怎么办?
if (instance == null) {
synchronized (ABC.class) {
// What if we remove this check?
if (instance == null) {
instance = new ABC();
}
}
问题2:以下内容有什么区别?
public ABC getInstance() {
if (instance == null) {
// Difference here
synchronized (ABC.class) {
if (instance == null) {
instance = new ABC();
}
}
}
return instance;
}
private static final Object LOCK = new Object();
.
.
public ABC getInstance() {
if (instance == null) {
// Difference here
synchronized (LOCK) {
if (instance == null) {
instance = new ABC();
}
}
}
return instance;
}
if (instance == null) {
// Difference here
synchronized (new Object()) {
if (instance == null) {
instance = new ABC();
}
}
}
答案 0 :(得分:-1)
如果要使用特定对象而非类或此对象锁定同步块,则将对象用作同步参数非常有用。这使您可以在同一类中使用不同的锁来拥有不同的代码块。例如:
Object o1 = new Object();
Object o2 = new Object();
synchronized(o1) {
//your synchronized block
}
synchronized(o2){
//other synchronized block
}
在先前的代码示例中,block1和block2可以由不同的线程同时执行,因为它们使用了不同的锁对象。如果您对两个代码块(即类)使用相同的锁,则块1将被阻塞,直到块2完成其执行为止,反之亦然。