JMM II

JMM

主存:共享资源;工作内存:局部变量。

  • 原子性:保证执行不受线程上下文切换的影响【并发的影响】;
    • 加锁;
  • 可见性:保存不受cpu缓存的影响【JIT,缓存优化】;
    • volatile:保证变量在多个线程的可见性【轻量级】;
    • synchronized:也可以保证所见性,释放锁时触发内存同步【重量级】;
    • Java 内存模型(JMM)规定,释放锁时会强制将线程本地内存的修改刷新到主内存,而获取锁时会从主内存重新加载变量
  • 有序性:保证指令不受cpu指令并行优化的影响
    • cpu指令并行优化
    • JIT,执行并行优化;

volatile原理:

volatile的底层原理是内存屏障,Menory Barrier

  • 对volatile变量的写操作后会加入写屏障;

    • 写屏障【sfence】:保证在该屏障之前的,对共享变量的改动【所有的共享变量都会flush】,都会同步到主存中;
    • 写屏障会确保指令重排序时,不会将写屏障之前的代码排在写屏障之后【屏障在后,保证不会后写,】;
  • 对volatile变量的读操作前会加入读屏障;

    • 读屏障:保证在该屏障之后,对共享变量的读取,加载的是主内存中最新的数据【所有的共享变量】【相当于清空缓存】;
    • 读屏障会确保指令重排时,不会将都屏障之后的代码排在读屏障之前【屏障在前,保证不会前读】;
  • volatile主要针对的是线程内部的有序性,可见性,线程之间的上下文切换无法保证【原子性】

  • synchronized有序性,可见性,原子性都能保证;

    • 有序性:仅仅在代码块内进行局部指令排序;
    • 可见性:释放锁时会强制将线程本地内存的修改刷新到主内存【flush】,而获取锁时会从主内存重新加载变量;
    • 原子性:锁的互斥性;
  • 可见性【happen-before】:

    • 线程的开启会自动内存读取共享变量,线程结束后会自动刷新共享变量;
    • 线程被打断【interrupt】,相当于抛出异常,线程会自动刷新共享变量;
    • 对默认值【0,false,null】的写,对其他线程可见【相当于仅作初始化】;
    • 具有传递性;
posted @ 2025-03-24 14:55  烟雨断桥  阅读(20)  评论(0)    收藏  举报