JMM是java的内存模型,是不存在的,是一种约定,概念 JMM的同步约定:
在加锁之前,要把主存中的共享变量复制到自己的工作内存中在解锁前,要把自己工作内存中的共享变量刷新到主存中加锁和解锁必须是同一把锁8种操作(四组:read和load,use和assign,write和store,lock和unlock)
保证可见性代码:
# 如果不添加volatile关键字,主线程修改了num的值,新建线程是不知道的,就会一直阻塞,加了volatile关键字,主线程修改了值,新建线程就会知道,代码就会停止 private volatile static int num = 0; public static void main(String[] args) { // 创建一个新线程 new Thread(()->{ while (num == 0) { } }).start(); try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } num = 1; System.out.println("主线程执行完毕"); }不保证原子性代码
# 虽然加了volatile关键字,但是num任然是不安全的。需要使用原子类 private volatile static int num = 0; public static void main(String[] args) { for (int i = 0; i < 20; i++) { new Thread(()->{ for (int i1 = 0; i1 < 1000; i1++) { num++; } }).start(); } // 判断当前的可用线程个数,java默认main和gc线程 while (Thread.activeCount() > 2) { Thread.yield(); } System.out.println(num); }指令重排