优缺点说明:
1). 这种方式采用了类加载的机制来保证初始化实例时只有一个线程。
2). 静态内部类方式在Singleton1类被加载时并不会立即实例化,而是在需要
实例化时,调用getSingleton1()方法,才会装载SingletonInstance类,从而完成
Singleton1的实例化。
3). 类的静态属性只会在第一次加载类的时候初始化,所以在这里,jvm帮助我们
保证了线程的安全性,在类进行初始化时,别的线程是无法进入的。
4). 优点: 避免了线程不安全,利用静态内部类特点实现延迟加载,效率高。
5). 结论: 推荐使用
package com.China.singleton.example7;
public class SingletonTest07 {
public static void main(String[] args){
//Singleton1 s1 = Singleton1.getSingleton1();
//Singleton1 s2 = Singleton1.getSingleton1();
// s1, s2是同一个实例
//System.out.println(s1 == s2);
//System.out.println(s1.hashCode()+" "+s2.hashCode());
T t1 = new T();
new Thread(t1).start();
T t2 = new T();
new Thread(t2).start();
System.out.println(t1.s1 == t2.s1);
}
}
class T implements Runnable{
public Singleton1 s1 = null;
@Override
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Singleton1 s1 = Singleton1.getSingleton1();
System.out.println(s1.hashCode());
}
}
// 静态内部类完成单例,推荐使用
class Singleton1{
// 构造器私有化,外部不能new
private Singleton1(){
}
// Singleton1加载的时候,并不会加载SingletonInstance,这样就可以保证懒加载
// 写一个静态内部类, 该类中有一个静态属性 Singleton1
private static class SingletonInstance{
private static final Singleton1 instance = new Singleton1();
}
// 向外部暴露一个静态的公共方法
public static Singleton1 getSingleton1(){
return SingletonInstance.instance;
}
}