线程安全性(二)

原子性
提供互斥访问,同一时刻只能有一个线程来对它进行操作

synchronized:依赖于JVM,属于不可中断锁,适合竞争不激烈,可读性好

Lock: 不依赖于JVM,需要手动解锁以及释放锁,属于可中断锁,竞争激烈时能维持常态

Atomic: 竞争激烈时候能保持常态,比Lock性能好,只能同步一个值

CAS算法?????

可见性
一个线程对主内存的修改可以及时的被其他的线程观察到
导致共享变量在线程间不可见的原因
1.线程交叉执行
2.重排序结合线程交叉执行
3.共享变量更行后的值没有在工作内存与主内存间及时更新

synchronized: JMM关于synchronized的两条规定

1).线程解锁前,必须把共享变量的最新值刷新到主内存中
2).线程加锁时,讲清空工作内纯种共享变量的值,从而使用共享变量时需要从主内存中重新读取最新的值(注意,加锁与解锁是同一把锁)

volatile: 通过加入内存屏障和禁止重排序优化来实现

1).对volatile变量写操作时,会在写操作后加入一条store屏障指令,将本地内存中的共享变量值刷新到主内存中
2).对volatile变量读操作时,会在读操作前加入一条load屏障指令,从主内存中读取共享变量

volatile注意事项,应该具备两个条件

1).运算结果并不依赖变量的当前值
2).变量不需要与其他的状态变量共同参与不变的约束
所以说volatile不适用于计数的场景,适用于状态标记量的场景

有序性
一个线程观察其他线程中的指令执行顺序,由于指令重排序的存在,该观察结果一般扎乱无序

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 第6章类文件结构 6.1 概述 6.2 无关性基石 6.3 Class类文件的结构 java虚拟机不和包括java...
    kennethan阅读 4,563评论 0 2
  • 本文首发于我的个人博客:尾尾部落 本文是我刷了几十篇一线互联网校招java后端开发岗位的面经后总结的多线程相关题目...
    繁著阅读 6,187评论 0 7
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 9,176评论 0 11
  • 以上代码会重复运行 , 不会停止。 JMM(java内存模型) 若想学习好多线程, 那么必须了解一下JMM Jav...
    尼尔君阅读 5,702评论 0 2
  • 除了充分利用计算机处理器的能力外,一个服务端同时对多个客户端提供服务则是另一个更具体的并发应用场景。衡量一个服务性...
    胡二囧阅读 5,193评论 0 12

友情链接更多精彩内容