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 중국어 웹사이트의 기타 관련 기사를 참조하세요!