并发编程的原子性随想

首先了解到并发编程有三个性质:原子性,可见性和有序性。

关于原子性,最重要的一个概念是原子性是针对一个操作而言,有点抽象,我是这么理解的:一个线程执行一段代码的时候没有受到其他线程执行这段代码的影响。

比如,i = 1; 这也是一段代码,而且必然是原子性的,因为一个线程在给i赋值为1的时候不可能受到其他线程的影响。再比如 i ++; 这就不一定是原子性了,因为i ++;这段代码的执行其实是分两步操作的,一步是从主内存中将i的值读到工作内存中,另一步是对i加一。一个线程在执行这两步操作的中间可能会受到其它线程的影响,比如刚执行完第一步有其他线程对i赋值,这就导致再执行第二步执行结果不准确。这只是一个简单的 i ++,更不用说一段代码了,肯定不能保证原子性。

voliate关键字可以利用内存屏障将工作内存中的值及时地刷新进主内存,他保证的是可见性,并不能保证原子性。很好理解,还是 i ++; 就算保证了可见性,这两步之间还是可能会有其他线程再给i赋值,只不过会及时地刷新进主内存及时取到值而已,还是会受到其他线程的影响,所以不存在保证原子性。 

保证原子性最简单的方式就是加锁,保证只有一个线程在操作。还有一个CAS无锁机制,例如AutomicInteger、AutomicBoolean等这类并发包下面的原子类,他们就是利用CAS保证了i+1、b = ture等这些操作的原子性。

说到这里我还想强调一下一个重要的地方,为什么前面说:一个线程执行一段代码的时候没有受到其他线程执行这段代码的影响。而不是说:一个线程执行一段代码的时候没有其他线程也在执行这段代码。因为虽然其他线程也在执行这段代码,但是并不影响。所以voliate并不能保证原子性,但是操作可能是原子性的,即其他线程执行对当前线程没有影响,强调保证这个词。而CAS机制则是保证了不管有多少线程一起执行,肯定没有影响,所以CAS机制可以保证原子性。

猜你喜欢

转载自blog.csdn.net/weixin_42447959/article/details/83590732