java 병렬 환경 보안 초기 화

문 제 는 병발 환경 이 실 행 될 때 초기 화 되 어 좀 어 지 럽 습 니 다.곰 곰 이 생각해 보 니 실현 되 었 습 니 다.
볼 수 있 도록 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();
        }
    }
}

좋은 웹페이지 즐겨찾기