版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35165632/article/details/83786747
单件模式:
单件模式:确保一个类只有一个实例,并提供一个全局访问点。
解释:单件模式 确保程序中一个类最多只有一个实例。单件模式也提供访问这个实例的全局点。在java中实现单件模式需要有私有的构造器、一个静态方法和一个静态变量。确定在性能和资源上的限制,然后小心的选择适当的方案来实现单件,以解决多线程问题(我们必须认定所有的程序都是多线程的)。jdk5 之前的双重检查锁单例会失效。如果使用多个类加载器单件模式也会失效。
以下是一个简单的单件例子
/**
简单的单件实现
**/
public class Single{
// 一个静态变量
private static Single single;
// 一个私有的构造方法
private Single(){};
// 一个静态方法
private Single getInstance(){
if(single!=null){
single = new Single();
}
return single;
}
}
上面这个例子简单确完整的实现了单件模式,但是却存在多线程的隐患。所以我们进行了修改,让获取实例的方法多线程和也可用。
/**
锁机制简单的单件实现
**/
public class Single{
// 一个静态变量
private static Single single;
// 一个私有的构造方法
private Single(){};
// 一个静态方法(对获取的实例加锁)
private synchronized Single getInstance(){
if(single!=null){
single = new Single();
}
return single;
}
}
这样解决了多线程的问题,但是新的问题又出现了....就是效率问题,每次获取实例就有可能被阻塞。如何进行优化呢?
/**
双重检查锁单件实现
**/
public class Single{
// 一个静态变量(运用了volatile关键字,让single的改变直接放到共有内存区,保证变量的可见性)
private volatile static Single single;
// 一个私有的构造方法
private Single(){};
// 一个静态方法(对获取的实例加锁)
private synchronized Single getInstance(){
if(single!=null){
// 保证只有single属性不为空的时候,对整个类加锁。
synchronized(Single.class){
single = new Single();
}
}
return single;
}
}
没了。