美文网首页
线程安全性(二)

线程安全性(二)

作者: 菜鸟程序员一枚 | 来源:发表于2019-02-22 12:22 被阅读24次

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

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不适用于计数的场景,适用于状态标记量的场景

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

相关文章

  • 线程安全性(二)

    原子性 - 锁 原子性提供了互斥访问,同一时刻只能有一个线程对它进行操作。能保证同一时刻只有一个线程进行操作的,除...

  • 线程安全性(二)

    原子性提供互斥访问,同一时刻只能有一个线程来对它进行操作 synchronized:依赖于JVM,属于不可中断锁,...

  • 二、线程安全性

    要编写线程安全的代码其核心在于要对状态访问操作进行管理,特别是对共享的(shared)和可变的(Mutable)状...

  • EffectiveJava第十章第五节

    线程安全性的文档化 并非出现synchronized关键字就是线程安全性文档化了。实际上,一个类支持的线程安全性有...

  • String的线程安全

    线程安全性 说道有关string的线程安全性,大家想到的肯定时stringbuffer和stringbuilder...

  • Java并发编程 线程安全性

    什么是线程安全性 线程安全性:当多个线程访问某个类时,不管运行时采用何种调度方式或者这些线程将被如何交替执行,并且...

  • java并发编程实战2~3

    2 线程安全性 2.1 什么是线程安全性 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何...

  • 谈谈并发编程中的线程安全性

    1. 线程安全性 在单线程程序中,我们并不需要去考虑线程的安全性。但是在多线程程序中,由于多个线程要共享相同的内存...

  • 线程安全性(一)

    参考线程安全性总结 CountDownLatchCountDownLatch 可以阻塞线程并保证线程在满足某种特定...

  • 高并发编程03 ~ 线程安全性

    这节我们讨论一个话题:线程安全性 一、概念 线程安全性:当多个线程同时访问某个资源的时候,不管环境采用何种调度方式...

网友评论

      本文标题:线程安全性(二)

      本文链接:https://www.haomeiwen.com/subject/gcmpdqtx.html