题目是并发环境 运行时初始化,有点晕菜,仔细想了下实现
为了保持可见性使用volatile,最开始调用getInstance可能导致写锁竞争,写锁内部还要加个判空
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class SyncSingleton {
private static volatile SyncSingleton single=null;
private static final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private static final Lock r=lock.readLock();
private static final Lock w=lock.writeLock();
private SyncSingleton(){
}
public static SyncSingleton getInstance(){
if (single == null) { //运行时判断,为空初始化
w.lock();//上写锁
try {
if (single==null) {//写锁可能有多个线程等待,这里需要再判断一下
single=new SyncSingleton();
}
} finally {
w.unlock();
}
}
return single;
}
public String readMethod(){
r.lock();
try {
//....
} finally {
r.unlock();
}
return null;
}
public void modifySingleton(){
w.lock();
try {
//....
} finally {
w.unlock();
}
}
}
转载于:https://blog.51cto.com/yingtju/1281174