1. import java.util.ArrayList;
    2. import java.util.Collections;
    3. import java.util.HashMap;
    4. import java.util.List;
    5. import java.util.concurrent.ExecutorService;
    6. import java.util.concurrent.Executors;
    7. import java.util.concurrent.atomic.AtomicInteger;
    8. import java.util.concurrent.atomic.AtomicIntegerArray;
    9. import java.util.concurrent.locks.Condition;
    10. import java.util.concurrent.locks.Lock;
    11. import java.util.concurrent.locks.ReentrantLock;
    12. public class VolatileTest {
    13. /**
    14. * volatile 是一个类型修饰符
    15. * 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。(实现可见性)
    16. * 禁止进行指令重排序。(实现有序性)
    17. * volatile 只能保证对单次读/写的原子性。i++ 这种操作不能保证原子性。
    18. */
    19. //实现1 缓存一致性协议
    20. //多个线程从主内存中读值到工作缓存,当其中一个线程中修改了工作缓存的数值,该数据会立即同步回主内存
    21. //其他线程通过 主线嗅探机制 可以感知到数据的变化从而将自己缓存的数据失效
    22. // private static boolean flag = true;
    23. //底层通过一个汇编Lock前缀指令 实现的是缓存行锁 锁这块内存区域的缓存 数据会立即同步回主内存
    24. private static volatile boolean flag = true;
    25. public static void main(String[] args) {
    26. List<Object> objects = Collections.synchronizedList(new ArrayList<>());
    27. // CopyOnWriteArrayList
    28. new Thread(() -> {
    29. while (flag) {
    30. }
    31. System.out.println("=======================Thread");
    32. }).start();
    33. try {
    34. Thread.sleep(100);
    35. } catch (InterruptedException e) {
    36. e.printStackTrace();
    37. }
    38. System.out.println("=========================main");
    39. flag = false;
    40. }
    41. //1.给对象分配内存空间
    42. //2.初始化 主要涉及三种执行对象初始化的结构,分别是 实例变量初始化、实例代码块初始化 以及 构造函数初始化。
    43. //3.指向刚分配的内存地址 此时实例 != null
    44. // 123 变 132 重排 即引用 volatileTest 指向内存memory时,这段崭新的内存还没有初始化
    45. //双重检查机制 DCL
    46. //指令重排序 As-if-Serial 和 Happens-Before原则
    47. //java语义分析不存在依赖就有可能进行重排序
    48. //As-if-Serial:不管怎么重排序 ,单线程的执行结果不能改变 他不知道多线程重排序会影响其他线程的结果
    49. //Happens-Before 八大原则
    50. private static volatile VolatileTest volatileTest;
    51. private VolatileTest() {};
    52. public static VolatileTest getVolatileTest(){
    53. if (null == volatileTest) {
    54. synchronized (VolatileTest.class) {
    55. if (null == volatileTest) {
    56. volatileTest = new VolatileTest();
    57. }
    58. }
    59. }
    60. return volatileTest;
    61. }
    62. }