双重检查锁的两层判断及synchronized的意义?
有谁能解释清楚的么?
检查一:如果已经创建过实例了就不用创建了。
加锁:保证只有一个线程去执行创建实例的代码。
检查二:防止线程A执行完检查一后,线程调度到线程B,这时候线程B可以创建完实例并释放锁。再切回线程A时,加完锁还需要再判断一次。
双重校验锁,这种如楼上所说的,但是在多线程情况下还是不安全的。
必须private static volatile SingletonDemo instance = null; 加上volatile关键字,因为编译器存在指令重排的,所以在线程数量多的时候存在数据错乱。
你是不是很疑惑为什么 已经加了锁,并且在锁前加了if. 为什么还在锁里面再来个 if判断.这不会脱裤子放屁多此一举吗?
这个地方涉及到指令重排序问题.
那指令重排序如何影响 的呢.
这是下一个问题了.欢迎自己探索或者再提问
动手操作
https://blog.csdn.net/chai1143126501/article/details/110825934