点击领取优惠~
417 字
2 分钟
说说你对原子性、可见性、有序性的理解?
说说你对原子性、可见性、有序性的理解?
原子性、有序性、可见性是并发编程中非常重要的基础概念,JMM 的很多技术都是围绕着这三大特性展开。
- 原子性:原子性指的是一个操作是不可分割、不可中断的,要么全部执行并且执行的过程不会被任何因素打断,要么就全不执行。
- 可见性:可见性指的是一个线程修改了某一个共享变量的值时,其它线程能够立即知道这个修改。
- 有序性:有序性指的是对于一个线程的执行代码,从前往后依次执行,单线程下可以认为程序是有序的,但是并发时有可能会发生指令重排。
分析下面几行代码的原子性?
int i = 2;int j = i;i++;i = i + 1;- 第 1 句是基本类型赋值,是原子性操作。
- 第 2 句先读 i 的值,再赋值到 j,两步操作,不能保证原子性。
- 第 3 和第 4 句其实是等效的,先读取 i 的值,再+1,最后赋值到 i,三步操作了,不能保证原子性。
原子性、可见性、有序性都应该怎么保证呢?
- 原子性:JMM 只能保证基本的原子性,如果要保证一个代码块的原子性,需要使用synchronized 。
- 可见性:Java 是利用volatile关键字来保证可见性的,除此之外,final和synchronized也能保证可见性。
- 有序性:synchronized或者volatile都可以保证多线程之间操作的有序性。
说说你对原子性、可见性、有序性的理解?