public class SingletonTest4 { public static void main(String[] args) { System.out.println("多线程模式下测试该方法:"); for (int i = 0; i < 10; i++) { new Thread(() -> { SingletonDemo4 instance1 = SingletonDemo4.getInstance(); System.out.println("获取实列对象的hashCode:" + instance1.hashCode()); },String.valueOf(i)).start(); }
}
}
class SingletonDemo4{
private SingletonDemo4() {};
private static SingletonDemo4 instance;
public static synchronized SingletonDemo4 getInstance() { if(instance == null) { instance = new SingletonDemo4(); } return instance; } }
5、双重检查的方法,线程安全,延迟加载,效率较高,在系统中推荐使用。
public class SingletonTest5 { public static void main(String[] args) { //测试多线程环境下的结果 for (int i = 0; i < 10; i++) { new Thread(() -> { SingleDemo5 instance = SingleDemo5.getInstance(); System.out.println(instance.hashCode()); },String.valueOf(i)).start();; } } }
class SingleDemo5{ private static SingleDemo5 instance;
public static void main(String[] args) { for (int i = 0; i < 10; i++) { new Thread(() -> { System.out.println(SingleDemo6.getInstance().hashCode()); },String.valueOf(i)).start(); } } }
class SingleDemo6{
private SingleDemo6() {};
/**静态内部类**/ private static class SingletonHolder{ private static final SingleDemo6 INSTANCE = new SingleDemo6(); }
public static SingleDemo6 getInstance() { return SingletonHolder.INSTANCE; } }
7、采用枚举的方式来实现,这种方式推荐使用。
public class SingleTest7 {
public static void main(String[] args) { for (int i = 0; i < 10; i++) { new Thread(() -> { System.out.println(SingleDemo7.INSTANCE.hashCode()); },String.valueOf(i)).start(); } } }