>  기사  >  Java  >  Java의 몇 가지 일반적인 디자인 패턴에 대한 간략한 설명: 싱글톤 패턴

Java의 몇 가지 일반적인 디자인 패턴에 대한 간략한 설명: 싱글톤 패턴

无忌哥哥
无忌哥哥원래의
2018-07-23 11:25:101676검색

1. 싱글톤 패턴

Java에서 가장 일반적으로 사용되는 디자인 패턴 중 하나이며, 핵심 구조에는 싱글톤이라는 특수 클래스만 포함되어 있습니다. 싱글톤 패턴은 시스템에 이 패턴을 적용하는 클래스의 인스턴스가 하나만 있도록 보장할 수 있습니다.

2. 패턴 요구 사항

1. 자신만의 생성 방법은 비공개여야 합니다

2. 클래스 내에 고유한 인스턴스를 생성합니다.

3. 인스턴스를 얻기 위해 다른 개체에 대한 공개 정적 메서드를 제공합니다. 구현 방법

Hungry Chinese style

public class Simple {
private static Simple simple = new Simple();
private Simple() {
}
public static Simple getInstance() {
return simple;
}
}

이 구현 방법은 클래스가 로드될 때 인스턴스화되고 지연된 로드가 없으며 스레드로부터 안전합니다.

Lazy Man style

public class Slacker {
private static volatile Slacker slacker = null;
private Slacker() {
}
/**
* 最简单的懒汉式实现
* @return
*/
public static Slacker getInstance() {
if(slacker == null) {
slacker = new Slacker();
}
return slacker;
}
}

이 구현은 가장 기본적인 구현입니다. 가장 큰 문제는 다중 스레딩을 지원하지 않는다는 것입니다. 동시 액세스 방법은 둘 이상의 인스턴스를 획득하므로 엄밀히 말하면 싱글톤 모드가 아닙니다.

public class Slacker {
//volatile关键字的作用
//1、保证内存可见性:保证每个线程访问volatile修饰的共享变量时获取到的都是最新的。
//2、防止指令重排序--通过内存屏障实现
private static volatile Slacker slacker = null;
private Slacker() {
}
/**
* 加synchronized关键字解决线程同步问题
* @return
*/
public static synchronized Slacker getInstanceSync() {
if(slacker == null) {
slacker = new Slacker();
}
return slacker;
}
}

메소드에 동기화된 잠금을 추가하는 이 방법은 스레드의 동시 액세스 문제를 해결하고 싱글톤을 구현할 수 있습니다. 그러나 잠금을 추가하면 효율성에 영향을 미치므로 이 방식으로 사용되지 않는 경우가 많습니다.

이중 확인 잠금

public class Slacker {
//volatile关键字的作用
//1、保证内存可见性:保证每个线程访问volatile修饰的共享变量时获取到的都是最新的。
//2、防止指令重排序--通过内存屏障实现
private static volatile Slacker slacker = null;
private Slacker() {
}
/**
* 双重检查锁解决线程同步问题
* @return
*/
public static Slacker getInstanceDoubleLock() {
if(slacker == null) {
synchronized (Slacker.class) {
if(slacker == null) {
slacker = new Slacker();
}
}
}
return slacker;
}
}

이 방법은 다중 스레드 동시 액세스에 적응하고 고성능을 유지할 수 있는 이중 잠금 메커니즘을 사용합니다.

정적 내부 클래스 구현

/**
* 静态内部类方式实现单例模式
*
* 当StaticInnerClass第一次被加载时,并不需要去加载StaticInnerClassHoler,只有当getInstance()方法第一次被调用时,
* 才会去初始化staticInnerClass,第一次调用getInstance()方法会导致虚拟机加载StaticInnerClassHoler类,这种方法不仅能
* 确保线程安全,也能保证单例的唯一性,同时也延迟了单例的实例化。
*
* @author chenf
*
*/
public class StaticInnerClass {
private StaticInnerClass() {
}
// 静态内部类
private static class StaticInnerClassHoler {
// 在静态内部类中定义外部类的实例
private static StaticInnerClass staticInnerClass = new StaticInnerClass();
}
/**
* 获取时调用静态内部类的类属性获取外部类的实例
*
* @return
*/
public static StaticInnerClass getInstance() {
return StaticInnerClassHoler.staticInnerClass;
}
}

이 방법은 다중 스레드의 안전한 액세스를 달성할 수 있을 뿐만 아니라 내부 클래스 로딩 메커니즘을 사용하여 지연 로딩을 달성합니다.

위 내용은 Java의 몇 가지 일반적인 디자인 패턴에 대한 간략한 설명: 싱글톤 패턴의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.