Java多线程——单例模式 懒汉式
懒汉式
1、第一次使用类时,再创建实例
2、双重检测锁
3、需要用volatile修饰instance域
package Single;
//单例模式
//懒汉模式
//检查是否存在,不存在再创建
//线程不安全
/**
* 双重检测锁模式的懒汉式单例
* 多线程同时访问时,可能会进入上一层判断,这里加上锁,synchronized锁class,只有一个类
*/
public class LazyMen {
private LazyMen(){
System.out.println(Thread.currentThread().getName()+"运行成功");
}
private volatile static LazyMen lazyMen;//双重检测锁,需要volatile 修饰instance
public static LazyMen getInstance(){
if (lazyMen==null){
synchronized(LazyMen.class){
if (lazyMen == null) {
lazyMen=new LazyMen();//不是一个原子性操作
/**
* 1、分配内存空间
* 2、执行构造方法,初始化对象
* 3、把这个对象指向这个内存空间
*
* 123
* 132 A线程进来,执行完第一步,此时
* 如果B线程进来,可能判断不等于null,
* 直接返回lazymen对象,出现错误,所以,必须在instance域加上volatile
*/
}
}
}
return lazyMen;
}
//线程不安全示例
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(()->{LazyMen.getInstance();}).start();
}
}
}