单例模式
Singleton1.java
package edu.singleton; /*** * 把该类设计成单例设计模式(饿汉式) */ public class Singleton1 { // 定义一个本类对象并实例化 private static Singleton1 singleton = new Singleton1(); // 构造方法私有化 private Singleton1() { }; public static Singleton1 getInstance() { return singleton; } public void print() { System.out.println("饿汉式--单例设计模式"); } }
SingletonDemo.java
package edu.singleton; public class SingletonDemo { public static void main(String[] args) { Singleton1 singleton1 = Singleton1.getInstance(); singleton1.print(); Singleton1 singleton2 = Singleton1.getInstance(); singleton2.print(); System.out.println(singleton1 == singleton2); } } /* * 饿汉式--单例设计模式 饿汉式--单例设计模式 true */
Singleton2.java
package edu.singleton; /*** * 把该类设计成单例设计模式(懒汉式:会有线程安全问题) */ public class Singleton2 { // 定义一个本类对象并实例化 private static Singleton2 singleton = null; // 构造方法私有化 private Singleton2() { }; public static Singleton2 getInstance() { if (singleton == null) { singleton = new Singleton2(); } return singleton; } public void print() { System.out.println("饿汉式--单例设计模式"); } }
Singleton3.java
package edu.singleton; /*** * 把该类设计成单例设计模式(懒汉式:加线程锁,解决线程安全问题) */ public class Singleton3 { // 定义一个本类对象并实例化 private static Singleton3 singleton = null; // 构造方法私有化 private Singleton3() { }; public static Singleton3 getInstance() { /* * 如果第一个线程获取到了单例的实例对象, 后面的线程再获取实例的时候不需要进入同步代码块中了 */ // 同步代码块用的锁是单例的字节码文件对象,且只能用这个锁 if (singleton == null) { synchronized (Singleton3.class) { singleton = new Singleton3(); } } return singleton; } public void print() { System.out.println("饿汉式--单例设计模式"); } }