자바 단일 예 --- 이중 잠 금 검사 상세 설명
4148 단어 자바
무엇이 단일 모드 입 니까?하나의 대상 JVM 에서 하나의 인 스 턴 스 만 코드 에 직접 올 릴 수 있 도록 보증 합 니 다.
/**
* 双重锁校验的单例
*/
public class DoubleLock implements Serializable{
public static volatile DoubleLock doubleLock = null;//volatile防止指令重排序,内存可见(缓存中的变化及时刷到主存,并且其他的内存失效,必须从主存获取)
private DoubleLock(){
//构造器必须私有 不然直接new就可以创建
}
public static DoubleLock getInstance(){
//第一次判断,假设会有好多线程,如果doubleLock没有被实例化,那么就会到下一步获取锁,只有一个能获取到,
//如果已经实例化,那么直接返回了,减少除了初始化时之外的所有锁获取等待过程
if(doubleLock == null){
synchronized (DoubleLock.class){
//第二次判断是因为假设有两个线程A、B,两个同时通过了第一个if,然后A获取了锁,进入然后判断doubleLock是null,他就实例化了doubleLock,然后他出了锁,
//这时候线程B经过等待A释放的锁,B获取锁了,如果没有第二个判断,那么他还是会去new DoubleLock(),再创建一个实例,所以为了防止这种情况,需要第二次判断
if(doubleLock == null){
//下面这句代码其实分为三步:
//1.开辟内存分配给这个对象
//2.初始化对象
//3.将内存地址赋给虚拟机栈内存中的doubleLock变量
//注意上面这三步,第2步和第3步的顺序是随机的,这是计算机指令重排序的问题
//假设有两个线程,其中一个线程执行下面这行代码,如果第三步先执行了,就会把没有初始化的内存赋值给doubleLock
//然后恰好这时候有另一个线程执行了第一个判断if(doubleLock == null),然后就会发现doubleLock指向了一个内存地址
//这另一个线程就直接返回了这个没有初始化的内存,所以要防止第2步和第3步重排序
doubleLock = new DoubleLock();
}
}
}
return doubleLock;
}
}
설명 을 잘 썼 습 니 다. 여러분 이 직접 보 세 요. 위 에 코드 에 구 덩이 를 묻 었 습 니 다. 바로 이런 실현 류 implements Serializable 인터페이스 입 니 다. 이것 은 이러한 유형 이 직렬 화 될 때 단일 사례 가 파괴 되 는 것 입 니 다. 이 문제 의 해결 방식 과 원 리 는 제 다른 블 로 그 를 보 세 요. 자바 직렬 화 파괴 단일 모델 원 리 는 개인 적 으로 얕 은 이 해 를 해석 하고 보충 을 환영 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.