一个类只能有一个实例
线程池、日志对象、缓存等。需要让这些对象在整个程序中只有唯一的实例,
保证所有访问它们的对象得到的都是同样的数据。
1.私有化构造方法
2.提供公共的构造方法返回单实例,供其他对象访问
3.声明一个变量保存实例化出来的单实例
public class LazySingleton {
private static LazySingleton singleton ;
private LazySingleton(){}
public static LazySingleton getSingletonInstance(){
if(singleton == null){
singleton = new LazySingleton();
}
return singleton;
}
}
public class LazySingleton2 {
private static LazySingleton2 singleton ;
private LazySingleton2(){}
public static synchronized LazySingleton2 getSingletonInstance(){
if(singleton == null){
singleton = new LazySingleton2();
}
return singleton;
}
}
public class LazySingleton3 {
private volatile static LazySingleton3 singleton ;
private LazySingleton3(){}
public static synchronized LazySingleton3 getSingletonInstance(){
if(singleton == null){
synchronized (LazySingleton3.class) {
if(singleton == null) {
singleton = new LazySingleton3();
}
}
}
return singleton;
}
}
public class HungrySingleton {
private static HungrySingleton singleton = new HungrySingleton();
private HungrySingleton(){}
public static HungrySingleton getSingletonInstance(){
return singleton;
}
}
public class ThreadLazySingleton implements Runnable{
@Override
public void run() {
String name = Thread.currentThread().getName();
LazySingleton lazy = LazySingleton.getSingletonInstance();
System.out.println("线程" + name + "得到实例" + lazy);
}
}
public class testSingletonDemo {
public static void main(String[] args) {
Thread t1= new Thread(new ThreadLazySingleton(),"线程1");
Thread t2= new Thread(new ThreadLazySingleton(),"线程2");
Thread t3= new Thread(new ThreadLazySingleton(),"线程3");
t1.start();
t2.start();
t3.start();
}
}
结果(1)
线程线程1得到实例pattern.singleton.LazySingleton@5c562746
线程线程3得到实例pattern.singleton.LazySingleton@5c562746
线程线程2得到实例pattern.singleton.LazySingleton@5c562746
结果(2)
线程线程1得到实例pattern.singleton.LazySingleton@3133744f
线程线程3得到实例pattern.singleton.LazySingleton@273bdf75
线程线程2得到实例pattern.singleton.LazySingleton@25d849fd
结果(3)
线程线程2得到实例pattern.singleton.LazySingleton@2839e23b
线程线程3得到实例pattern.singleton.LazySingleton@2839e23b
线程线程1得到实例pattern.singleton.LazySingleton@2839e23b
- 从结果看出,没被同步的懒汉式,在多线程环境下,会出现多个线程得到了不同的实例的情况。