java 单例模式,
分享于 点击 10348 次 点评:195
java 单例模式,
package singleton;
public class Singleton {
private static Singleton sin;
private Singleton() {
}// 保证只能在本类中进行实例化
// 懒汉模式,存在线程安全问题
public static Singleton getInstance() {
if (sin == null) {
sin = new Singleton();
}
return sin;
}
//性能会下降
/* public synchronized static Singleton getInstance() {
if (sin == null) {
sin = new Singleton();
}
return sin;
}*/
//即使这个单例没有用到也会被创建,而且在类加载之后就被创建,内存就被浪费了。(饿汉模式)
private static Singleton sin1 = new Singleton();
public static Singleton getsin1() {
return sin1;
}
//双重校验锁(饿汉)
private volatile static Singleton sin2;//volatile 防止指令重排序
//private static Singleton sin2;//volatile 防止指令重排序
/**
* 这个问题的关键就在于由于指令重排优化的存在,导致初始化Singleton和将对象地址赋给instance字段的顺序是不确定的。
* 在某个线程创建单例对象时,在构造方法被调用之前,就为该对象分配了内存空间并将对象的字段设置为默认值。
* 此时就可以将分配的内存地址赋值给instance字段了,然而该对象可能还没有初始化。
* 若紧接着另外一个线程来调用getInstance,取到的就是状态不正确的对象,程序就会出错。
*
* 使用valotile 便可以解决这个问题
*
* @return
*/
public static Singleton getsin2(){
if(sin2==null){
synchronized(Singleton.class){
if(sin2 == null){
sin2=new Singleton();
}
}
}
return sin2;
}
}
相关文章
- 暂无相关文章
用户点评