美文网首页
1.2.2 线程安全之原子性操作

1.2.2 线程安全之原子性操作

作者: MichealDiao | 来源:发表于2019-11-16 13:14 被阅读0次

什么是原子操作

一个或若干个操作看成一个整体,要不全不执行要不全部不执行

可见性问题和原子性问题的区别

  • 可见性问题
    是一个人修改了但另一个人不能够及时的看见
  • 原子性问题
    读取了值之后,值失效了

这些问题产生的原因

  1. 因为CPU高速缓存
  2. 因为线程的独占内存和主内存的关系:所有的变量都在主内存有一份原件,每个线程运行的时候会去主内存拷贝一份,如果线程对变量有修改的话,就把最新的值同步到主内存,这就导致之间会有线程不安全的问题
  3. 指令重排,jit编译(运行时编译)会对代码进行优化,譬如
while(flag){}

在经历了N次循环后,编译器会认为永远都不会等于0,然后优化成

if(flag==true)
{
  while(true){}
}

解决可见性问题的方法:volatile

  1. 用volatile关键字描述的变量,虽然仍然会在线程的独占内存里有一份拷贝,但是每次读取之前,仍然会去主内存读取一次
  2. 使用了volatile修饰的变量,相关的代码不会进行指令重排。

CAS COMPARED AND SWAP 比较与交换

这是硬件级别的用来解决原子性问题的一个方法,它需要两个值

  • 旧值
  • 新值
    在把新值写到内存之前,把旧值跟内存的值比较,如果一样的话,才把新值写进内存,否则的话,放弃这次操作。

UNSAFE JVM级别的CAS工具类

AtmoicInteger、AtmoicIntegerArray、AtmoicReferenceArray之类的

相关文章

  • 1.2.2 线程安全之原子性操作

    什么是原子操作 一个或若干个操作看成一个整体,要不全不执行要不全部不执行 可见性问题和原子性问题的区别 可见性问题...

  • 1.2.2 线程安全之原子操作CAS

    竞态条件与临界区 多个线程访问了相同的资源,向这些资源做了写操作时,对执行顺序有要求。 临界区: incr 方法内...

  • 2018-05-22

    nonatomic的内存管理语义是非原子性的,非原子性的操作本来就是线程不安全,而atomic的操作是原子性的,但...

  • iOS nonatomic与atomic

    nonatomic的内存管理语义是非原子性的,非原子性的操作本来就是线程不安全,而atomic的操作是原子性的,但...

  • 2018-07-12

    volatile不能保证原子性,所以用它修饰的变量,如果执行非原子性操作,那不能保证线程安全,比如++操作,但是=...

  • Java-可见性、原子性、有序性

    关键字:Java内存模型(JMM)、线程安全、可见性、原子性、有序性 1.线程安全(JMM) 多线程执行某个操作的...

  • 分布式事务

    1、线程安全保证线程安全一般分成两种方式:锁和原子变量原子变量:原子变量能够保证原子性的操作,意思是某个任务在执行...

  • AtomicInteger 类

    自增操作符(++),非原子性,线程不安全。线程安全的计数采用 synchronized 或 AtomicInteg...

  • Java多线程

    在java中,多线程一直是代表着高级 线程安全性 线程安全需要考虑操作的自己状态的原子性,竟态条件,复合操作 保证...

  • 源码修炼笔记之ThreadLocal详解

    多线程线程安全的根源就是“共享”,即多个线程操作共享变量会引起可见性、原子性和顺序性的问题。解决线程安全首先我们想...

网友评论

      本文标题:1.2.2 线程安全之原子性操作

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