단일 모드 → 파괴 → 파괴 저지
static
a. 정적 구성원 변수 b. 정적 블록 c. 정적 내부 클래스 static
CAS
의 장점: 전통 적 인 잠 금 체 제 를 사용 하여 스 레 드 안전 을 확보 할 필요 가 없다. CAS 는 바 쁜 기다 림 을 바탕 으로 하 는 알고리즘 으로 바 텀 하드웨어 의 실현 에 의존 하고 잠 금 에 비해 스 레 드 전환 과 차단 의 추가 소모 가 없 으 며 비교적 큰 병행 도 를 지원 할 수 있다.단점: 바 빠 서 계속 실행 하지 못 하면 CPU 에 큰 비용 이 들 수 있 습 니 다.b. synchronized
파괴 사례: 반사, 직렬 화
획득
실례 화 - readObject()
- readObject0(false)
- readOrdinaryObject() //
obj = desc.isInstantiable() ? desc.newInstance() : null;
- newInstance()
Object ob = in.readObject(); // Object
Target target = (Target) ob; // Target
readResolve()
방법.readOrdinary Object () 를 참고 하여 실현 합 니 다.여러 가지 사례 모델, 파괴 사례 모델, 조직 파괴 사례 모델
public class ModeSingleton {
/**
* ,
*/
static void destroySingletonByReflect() throws Exception {
SingletonOfHungary singleton = SingletonOfHungary.getInstance();
SingletonOfHungary newInstance;
Class clazz = SingletonOfHungary.class;
//
Constructor declaredConstructor = clazz.getDeclaredConstructor();
//
declaredConstructor.setAccessible(true);
//
newInstance = declaredConstructor.newInstance();
System.out.println("singleton.hashCode: " + singleton.hashCode());
System.out.println("newInstance.hashCode: " + newInstance.hashCode());
}
/**
* ,
*/
static void destroySingletonByDeSerialize() throws Exception {
SingletonOfHungary singleton = SingletonOfHungary.getInstance();
SingletonOfHungary newInstance;
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("tmp"));
out.writeObject(singleton);
File file = new File("tmp");
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
// readObject()
newInstance = (SingletonOfHungary) in.readObject();
System.out.println("singleton.hashCode: " + singleton.hashCode());
System.out.println("newInstance.hashCode: " + newInstance.hashCode());
}
/**
* 。
*/
static void stopReflectDestroy() throws Exception {
SingletonOfInnerStatic singleton = SingletonOfInnerStatic.getInstance();
SingletonOfInnerStatic newInstance;
Class clazz = SingletonOfInnerStatic.class;
//
Constructor declaredConstructor = clazz.getDeclaredConstructor();
//
declaredConstructor.setAccessible(true);
//
newInstance = declaredConstructor.newInstance();
System.out.println("singleton.hashCode: " + singleton.hashCode());
System.out.println("newInstance.hashCode: " + newInstance.hashCode());
}
/**
* 。 readResolve()
*/
static void stopDeSerializeDestroy() throws Exception{
SingletonOfInnerStatic singleton = SingletonOfInnerStatic.getInstance();
SingletonOfInnerStatic newInstance;
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("tmp"));
out.writeObject(singleton);
File file = new File("tmp");
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
// readObject()
newInstance = (SingletonOfInnerStatic) in.readObject();
System.out.println("singleton.hashCode: " + singleton.hashCode());
System.out.println("newInstance.hashCode: " + newInstance.hashCode());
}
public static void main(String[] args) throws Exception {
System.out.println(" , :");
destroySingletonByReflect();
System.out.println(" , :");
destroySingletonByDeSerialize();
System.out.println(" :");
stopReflectDestroy();
System.out.println(" ");
stopDeSerializeDestroy();
}
}
/**
* -
*/
class SingletonOfLazy {
private static SingletonOfLazy instance;
private SingletonOfLazy() {
}
public static SingletonOfLazy getInstance() {
if (instance == null) {
instance = new SingletonOfLazy();
}
return instance;
}
}
/**
* . -
*/
class SingletonOfHungary implements Serializable {
private static SingletonOfHungary instance = new SingletonOfHungary();
private SingletonOfHungary() {
}
public static SingletonOfHungary getInstance() {
return instance;
}
}
/**
* . -
*/
class SingletonOfInnerStatic implements Serializable{
private static SingletonOfInnerStatic instance;
// ,
private static boolean alreadyExist;
static {
instance = new SingletonOfInnerStatic();
alreadyExist = true;
}
private SingletonOfInnerStatic() {
if (alreadyExist) {
System.out.println(" , !");
}
}
public static SingletonOfInnerStatic getInstance() {
return instance;
}
public Object readResolve() {
return instance;
}
}
/**
* . -
*/
class SingletonOfInnerClass {
private SingletonOfInnerClass() {
}
private static class SingletonHolder {
private static final SingletonOfInnerClass INSTANCE = new SingletonOfInnerClass();
}
public static SingletonOfInnerClass getInstance() {
return SingletonHolder.INSTANCE;
}
}
/**
* . static -
*/
enum SingletonOfEnum {
INSTANCE;
}
/**
* -
*/
class SingletonOfCAS {
public static final AtomicReference INSTANCE = new AtomicReference<>();
private SingletonOfCAS() {
}
public static SingletonOfCAS getInstance() {
for (; ; ) {
SingletonOfCAS singleton = INSTANCE.get();
if (null != singleton) {
return singleton;
}
singleton = new SingletonOfCAS();
if (INSTANCE.compareAndSet(null, singleton)) {
return singleton;
}
}
}
}
/**
* ThreadLocal -
* ThreadLocal , , 。
* , (synchronized) “ ” , ThreadLocal “ ” 。
*/
class SingletonOfThreadLocal {
private SingletonOfThreadLocal() {
}
private static final ThreadLocal INSTANCE = ThreadLocal.withInitial(SingletonOfThreadLocal::new);
public static SingletonOfThreadLocal getInstance() {
return INSTANCE.get();
}
}
테스트 결과:
, :
singleton.hashCode: 1163157884
newInstance.hashCode: 1956725890
, :
singleton.hashCode: 1163157884
newInstance.hashCode: 325040804
:
, !
singleton.hashCode: 1173230247
newInstance.hashCode: 856419764
singleton.hashCode: 1173230247
newInstance.hashCode: 1173230247
추천 디자인 모델 - 단일 모델 의 파괴 가 상세 합 니 다. [주먹 을 안 는. jpg] 를 참고 하 였 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.