最近在看设计模式的书籍,打算一天学习一种设计模式,然后记录下来。由于本人还是在校生,Java方面的知识还是很浅薄,如果有错误,欢迎指出,谢谢大神们。
今天看了单例模式,单例模式有饿汉模式和懒汉模式,一般的懒汉模式又会出现线程安全的问题。下面来看一下:
饿汉模式:
public class SingleTon {
private static SingleTon singleTon = new SingleTon();
private SingleTon() { }
public static SingleTon getInstance() {
return singelTon;
}
}
懒汉模式:
public class SingleTon {
private static SingleTon singleTon = null;
private SingleTon( ) { }
public static SingleTon getInstance( ) {
if (singleTon == null) {
singleTon = new SingleTon();
return singleTon;
}
}
}
懒汉模式会导致线程安全问题,如果两个线程同时进入getInstance方法里面,都执行了singleTon 为空的判断成立的话,那么他们会分别生成一个实例,这样子就不是单例了。 可以这样子改进:
线程安全的懒汉模式:
public class SingleTon {
private static SingleTon singleTon = null;
private SingleTon( ) { }
public sychronized static SingleTon getInstance( ) {
if (singleTon == null) {
singleTon = new SingleTon();
return singleTon;
}
}
}
上面的代码还可以这样子改进,提高执行效率,这样子写也叫作双重锁定:
public class SingleTon {
private static SingleTon singleTon = null;
private SingleTon( ) { }
public static SingleTon getInstance ( ) {
if (singleTon == null) {
sychronized(this) {
if (singleTon == null) {
singleTon = new SingleTon();
}
}
}
return singleTon;
}
}
435

被折叠的 条评论
为什么被折叠?



