多线程|多线程 单例模式之懒汉
/**
* 1. 懒汉(延迟加载)
* 2. 正确
* 3. 效率还比较高
* 通过
* 1. volatile 的引入,目的解决 ins = new ...();
重排序带来的问题
* 2. synchronized 的引入,目的是解决原子性问题
* 3. 见方法注释
*/
public class LazySingleton3 {
//直属类的对象
private static volatile LazySingleton3 ins = null;
//构造方法
private LazySingleton3() {}
//一个获得ins 的方法
public static LazySingleton3 getInstance3() {
if (ins == null) {
synchronized (LazySingleton3.class) {
if (ins == null) {
ins = new LazySingleton3();
}
}
}return ins;
}
//建立一个线程的类
static class MyThread extends Thread {
@Override
public void run() {
LazySingleton3 ins1 = LazySingleton3.getInstance3();
System.out.println(ins1);
}
}
//将这个程序以多线程运行
public static void main(String[] args) {
MyThread[] threads = new MyThread[20];
for (int i = 0;
i < 20;
i++) {
threads[i] = new MyThread();
}
for (int i = 0;
i < 20;
i++) {
threads[i].start();
}
/*
单例模式之懒汉1 ins1 = 单例模式之懒汉1.getInstance();
单例模式之懒汉1 ins2 = 单例模式之懒汉1.getInstance();
单例模式之懒汉1 ins3 = 单例模式之懒汉1.getInstance();
System.out.println(ins1 == ins2);
System.out.println(ins2 == ins3);
*/
}
}
懒汉の单例模式:
单例:只实例化一个对象。
【多线程|多线程 单例模式之懒汉】与饿汉的开局就初始化不同,懒汉只是在有线程调用它时才会初始化对象,此举目的为节省内存空间。
若无synchronized 则会存在原子性不能保证的问题,可能会new出多个对象,不符合单例的情况。
若无外边的if(ins==null),那么会导致整个代码效率变低,因为在第一次new对象后,这个锁依旧会被互斥线程抢。
若无全局变量 ins 前的volatile,那么ins这个对象内部的(开辟空间,初始化,给引用赋值)三个大步骤会有重排序的问题。
推荐阅读
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 爱就是希望你好好活着
- 昨夜小楼听风
- 知识
- 死结。
- 我从来不做坏事
- 烦恼和幸福
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- Linux下面如何查看tomcat已经使用多少线程
- 说得清,说不清