> Java > java지도 시간 > Java 싱글톤 패턴을 완전히 마스터하세요.

Java 싱글톤 패턴을 완전히 마스터하세요.

WBOY
풀어 주다: 2022-04-13 19:04:08
앞으로
1883명이 탐색했습니다.

이 기사에서는 java에 대한 관련 지식을 제공하며, 주로 클래스에 인스턴스가 하나만 있고 클래스가 이 인스턴스를 스스로 생성할 수 있는 모드인 싱글톤 모드에 대한 관련 문제를 소개합니다. 함께 보시고, 모두에게 도움이 되었으면 좋겠습니다.

Java 싱글톤 패턴을 완전히 마스터하세요.

추천 학습: "java 비디오 튜토리얼"

단일 사례 패턴:

우선 Java에는 23가지 디자인 패턴이 있습니다. 패턴: 공장 메소드 패턴, 추상 팩토리 패턴, 싱글턴 패턴, 빌더 패턴, 프로토타입 패턴

    구조 패턴:
  • 어댑터 패턴, 데코레이터 패턴, 프록시 패턴, 모양새 패턴, 브리지 패턴, 구성 패턴, 플라이웨이트 패턴
  • 동작 유형 패턴:
  • : 전략 패턴, 템플릿 메소드 패턴, 관찰자 ​​패턴, 반복자 패턴, 책임 체인 패턴, 명령 패턴, 메모 패턴, 상태 패턴, 방문자 패턴, 중재자 패턴, 해석기 패턴.
  • 1. 싱글턴 패턴이란:
정의:

은 클래스에 인스턴스가 하나만 있고 클래스가 이 인스턴스를 스스로 생성할 수 있는 패턴을 말합니다. 이렇게 하면 여러 작업 관리자 창을 열거나 각 창의 표시 내용이 일치하지 않는 등의 오류로 인해 발생하는 메모리 리소스 낭비를 방지할 수 있습니다. 예를 들어, 우리 컴퓨터에는 하나의 작업 관리자만 열 수 있나요? 그렇죠. 리소스 낭비와 기타 오류를 방지하기 위함입니다.

프로젝트에서는 일반적으로 싱글톤 모드를 사용하여 도구 메서드를 호출하는 동일한 개체를 얻을 수 있습니다. 이 방법의 장점은 메모리 리소스를 소비하기 때문에 여러 개의 다른 개체를 만들 필요가 없다는 것입니다.

간단히 말하면 싱글턴은 프로그램에 인스턴스가 하나만 있다는 의미입니다. 동시에 이 클래스는 객체 생성이 하나만 있는지 확인해야 합니다.

싱글턴의 특징 패턴:

생성자 프라이빗 자체 유형 속성 보유

인스턴스를 얻기 위한 외부 정적 메서드 제공

    싱글톤 모드의 구조 다이어그램:
  1. 2. 싱글톤 모드의 장점과 단점:

장점:
Java 싱글톤 패턴을 완전히 마스터하세요.

메모리 사용량 감소 오버헤드리소스의 다중 점유 방지

글로벌 액세스 포인트를 설정하여 리소스에 대한 액세스를 최적화하고 공유

    단점(인터넷에서 참조):
  1. 일반적으로 인터페이스가 없으며 확장이 어렵습니다. 확장하고 싶다면 원본 코드를 수정하는 것 외에 다른 방법이 없습니다. 이는 열기 및 닫기 원칙을 위반합니다
  2. 동시 테스트에서 싱글톤 모드는 코드 디버깅에 도움이 되지 않습니다. 디버깅 과정에서 싱글턴의 코드가 실행되지 않으면 새로운 객체를 시뮬레이션할 수 없습니다. 싱글턴 모드의 기능 코드는 일반적으로 클래스에 작성됩니다. 단일 책임 원칙

싱글톤 모드의 마인드 맵 보기:

  1. 3. 게으른 모드(더 일반적으로 사용됨)
  2. 게으른 모드의 특징은 초기화가 지연되고 개체가 인스턴스화되지 않습니다.
  3. 스레드는 안전하지 않습니다. 엄밀히 말하면 싱글톤 모드가 아니므로 인스턴스를 얻은 후에 개체가 생성되므로 메모리 오버헤드가 절약됩니다.

public class SingLeton {

    //1、有自己类型的属性
    private static SingLeton instance;

    //2、构造器私有化
    private SingLeton(){}

    //3、对外提供获取实例的静态方法
    public static SingLeton getInstance(){
        if (instance == null){
            instance = new SingLeton();
        }
        return instance;
    }}
로그인 후 복사
테스트 클래스:

public class Test {
    public static void main(String[] args) {

        //判断是否产生的是同一个对象
        SingLeton s1 = SingLeton.getInstance();
        SingLeton s2 = SingLeton.getInstance();
        System.out.println(s1 == s2);
    }}
로그인 후 복사
로그인 후 복사
출력:

true
로그인 후 복사
로그인 후 복사

참고:

게으른 모드 스레드는 안전하지 않습니다

이제 우리는 게으른 모드 스레드가 안전하지 않다는 것을 알았습니다. 잠금(동기화)을 사용하여 동기화:

/**
 *   保证 instance 在所有线程中同步
 */public class SingLeton2 {

        //1、有自己类型的属性
        private static volatile SingLeton2 instance ;    
        
        //2、构造器私有化
        private SingLeton2() {
        }

        public static synchronized SingLeton2 getInstance() {
            //getInstance 方法前加同步
            if (instance == null) {
                instance = new SingLeton2();
            }
            return instance;
        }
    }
로그인 후 복사

멀티 스레딩을 작성하는 경우 위 예제 코드에서 휘발성 및 동기화 키워드를 삭제하지 마세요. 그렇지 않으면 스레드 비안전 문제가 발생합니다. 이 두 키워드를 삭제하지 않으면 스레드 안전성을 확보할 수 있지만, 접근할 때마다 동기화가 필요해 성능에 영향을 미치고 더 많은 리소스를 소모하게 된다는 것이 게으른 싱글톤의 단점이다.

4. Hungry Han 모드 [권장]

Hungry Han 모드는 스레드로부터 안전하고 일반적으로 사용되지만 Hungry Han 모드는 클래스를 처음 로드할 때

인스턴스를 초기화하기 때문에 가비지 개체를 생성하기 쉽습니다

데모:

/**
 *
 * 饿汉模式
 */public class SingLeton {

    //持有自己类型的属性   (和懒汉一样)
    //由于static修饰,只在类加载的时候执行一次,类加载的时候就实例化对象
    private static SingLeton instance = new SingLeton();

    //构造器私有化,不能通过它创建对象
    private SingLeton(){};

    //对外提供获取实例的静态方法
    public static SingLeton getInstance(){
        return instance;
    }}
로그인 후 복사

테스트 클래스:

public class Test {
    public static void main(String[] args) {

        //判断是否产生的是同一个对象
        SingLeton s1 = SingLeton.getInstance();
        SingLeton s2 = SingLeton.getInstance();
        System.out.println(s1 == s2);
    }}
로그인 후 복사
로그인 후 복사

출력:
true
로그인 후 복사
로그인 후 복사

게으른 모드와 배고픈 모드 비교:

  1. 懒汉模式延迟加载,非线程安全,饿汉模式线程安全
  2. 懒汉模式刚运行不实例化对象,需要的时候才实例化对象,相当于来讲更节省内存开销
  3. 饿汉模式只要运行都会加载类的时候就给你初始化了,就需要使用更大的内存

图解:
Java 싱글톤 패턴을 완전히 마스터하세요.

5、单例模式的应用场景:

  1. 需要经常创建的一些类,使用单例可以降低系统的内存压力
  2. 这个类只要求生成一个对象的时候,比如每个人的名字
  3. 类创建实例时占用资源较多,或实例化耗时较长,且经常使用
  4. 频繁访问数据库或文件的对象
  5. 类需要频繁实例化,而创建的对象又频繁被销毁的时候,如多线程的线程池

6、单例模式的应用实例

这里使用懒汉式单例模式模拟产生班级的班长
分析: 在每一个学期内,班级的班长只有一人,所以适合用单例模式实现

Person类:

/**
 * 使用懒汉模式
 */public class Person {

    //保证instance在所有线程中同步
    private static volatile Person instance;

    private Person(){
        System.out.println("产生一个班长");
    }

    //加上synchronized锁
    public static synchronized Person getInstance(){
        if(instance == null){
            instance = new Person();
        }else {
            System.out.println("错误信息:已经有一个班长,不能再产生");
        }
        return instance;
    }

    public void getName(){
        System.out.println("我是班长:小强");
    }}
로그인 후 복사

测试类:

public class Test {
    public static void main(String[] args) {

        Person p1 = Person.getInstance();
        p1.getName(); //输出班长名字

        Person p2 = Person.getInstance();
        p2.getName();

        if(p1 == p2){
            System.out.println("两个班长是同一个人");
        }else {
            System.out.println("两个班长是同一个人");

        }
    }}
로그인 후 복사

运行结果:

产生一个班长
我是班长:小强
错误信息:已经有一个班长,不能再产生
我是班长:小强
两个班长是同一个人
로그인 후 복사

小结:

这个就是单例模式,当程序已经产生一个对象后,就不会产生一个新的对象,即使有多个对象也是同一个对象而已,在使用懒汉模式的时候需要注意线程安全问题,在平时更加推荐使用饿汉模式,也需要注意资源的占用。

推荐学习:《java教程

위 내용은 Java 싱글톤 패턴을 완전히 마스터하세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿