이 기사에서는 java에 대한 관련 지식을 제공하며, 주로 클래스에 인스턴스가 하나만 있고 클래스가 이 인스턴스를 스스로 생성할 수 있는 모드인 싱글톤 모드에 대한 관련 문제를 소개합니다. 함께 보시고, 모두에게 도움이 되었으면 좋겠습니다.
추천 학습: "java 비디오 튜토리얼"
간단히 말하면 싱글턴은 프로그램에 인스턴스가 하나만 있다는 의미입니다. 동시에 이 클래스는 객체 생성이 하나만 있는지 확인해야 합니다.
싱글턴의 특징 패턴:
생성자 프라이빗 자체 유형 속성 보유
인스턴스를 얻기 위한 외부 정적 메서드 제공
장점:
글로벌 액세스 포인트를 설정하여 리소스에 대한 액세스를 최적화하고 공유
싱글톤 모드의 마인드 맵 보기:
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 모드 [권장]데모:
/** * * 饿汉模式 */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
게으른 모드와 배고픈 모드 비교:
图解:
这里使用懒汉式单例模式模拟产生班级的班长
分析: 在每一个学期内,班级的班长只有一人,所以适合用单例模式实现
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!