Java单例模式下的线程安全
首先我们来讲一下饿汉模式的线程安全
/**
* 饿汉模式下的单例 饿汉模式下是没有线程安全问题的
*
* @author xhh
*
*/
public class Singleton2 {
public static Singleton2 s = new Singleton2();
public static Singleton2 getSingleton() {
return s;
}
public Singleton2() {
}
}
建立5个线程,进行测试
从上述实验可知:饿汉模式下的单例,实际上在获取单例对象的时候并不存在对单例对象的读写,所以并不构成共享资源脏读写的环境,所以饿汉模式实现的案例是不存在线程安全性问题的。
懒汉模式
在没加锁的情况下的懒汉
/**
* 饱汉模式下的单例模式
* 没加锁的情况下
* @author 80769
*
*/
public class Singleton1 {
public static Singleton1 s=null;
public static Singleton1 getSingleton() {
if(s==null) {
s=new Singleton1();
}
return s;
}
}
以下是运行的截图
双检查锁下的饿汉单例模式
/**
* 线程安全的单例模式(懒汉)
* @author 80769
*
*/
public class Singleton {
public static volatile Singleton s=null;
public static Singleton getSinglen() {
synchronized(Singleton.class) {
if(s==null) {
s=new Singleton();
}
}
return s;
}
public Singleton() {
}
}
运行的结果
双检查锁(Double Check Lock - DCL):双检查锁值得就是一方面在共享资源对象上使用volatile关键字,一方面在对共享资源对象读写的代码段中,使用synchronized关键字的加锁方式,从共享资源对象变化的透明度到对共享资源的读写,双方面提供同步保障。