饿汉式
书写简单,不存在线程安全问题
/**
* 饿汉式
*/
class Single {
private static final Single s = new Single();
private Single() {
}
public static Single getInstance() {
return s;
}
}
/**
静态内部类
*/
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
懒汉式
存在线程安全问题,需要使用synchronized关键字保证线程的同步
/**
* 懒汉式
*/
class Single {
private static Single s = null;
private Single() {
}
public static Single getIntance() {
//在锁的外面多进行一次对象的非空判断,提升效率
if (s == null) {
synchronized (Single.class) {
if (s == null) {
s = new Single();
}
}
}
return s;
}
}
产生线程安全问题的原因:
首先当Thread-0第一次进入if判断中满足s=null的条件,但此时cpu将执行权交给 Thread-1,此时Thread-1的s=null满足条件,进入if代码块中,但此时cpu又将执行权交给Thread-0,Thread-0进行new Single对象并将其返回,此时cpu又将执行权交给Thread-1由于上次已经进入到if代码块中则直接new Single()对象,接着进行return,此时就会创建多个对象进行返回。线程安全问题产生,不满足单列的设计模式。