“白话”可见性,原子性,有序性!Java并发必备知识几分钟就记住

当你点开这篇文章,你可能会有点失望,因为这边文章用词不太官方,与在书上看到的东西不太一致。在这篇文章中的用词都会很“白话”,因为这些都是小编理解的总结,小编也会用最通俗的语言来介绍概念!

现在就开始介绍与Java并发相关的可见性,原子性,有序性!

“白话”可见性,原子性,有序性!Java并发必备知识几分钟就记住

如果没有接触过Java并发编程,可能很少会听过这三个性质。但是,当你开始接触并发编程后,理解了Java的内存模型,这三个性质就变得尤其重要!这里如果对内存模型不是很了解,可以参考小编的另外一篇文章《 》,那么今天小编就来介绍一下这三个性质的概念,这些概念可能和小伙伴们在书上看到的不同,但是,这一定是你最能看懂的概念了。

什么是原子性

学过化学的小伙伴应该都知道原子,原子在化学中是一种不可再分的粒子,也就是说,在化学中,原子就是最小的单位了。

在Java中,我们所说的原子性就和化学中所说的原子一样,都是一种不可再分的“粒子”。一个操作不能进行拆分,要么执行,要么不执行,这样的操作就是原子性操作!

在Java中,有些原子性变量的操作直接由Java的内存模型来保证,我们熟悉的基本数据类型(long和double除外)的访问、读、写操作都是原子性的。如果需要一些非原子性操作具备原子性,就需要程序员自行来控制了,可以利用lock/unlock、synchronized来保证原子性。

“白话”可见性,原子性,有序性!Java并发必备知识几分钟就记住

原子性就像化学的原子

什么是可见性

可见性就更加通俗易懂了,就是变量的变化可以被看到!当一个线程修改了一个共享变量,其他线程立即可以知道这个修改,那么这个共享变量就是具备可见性的。具有可见性的变量就像被装上了一个大喇叭,只要发生改变,就进行广播。

在Java中,通过将修改后的变量值同步到主内存,在变量读取前从主内从刷新变量的方式实现可见性的。不仅仅是被volatile关键字修饰的变量是这样实现可见性的,普通的变量也是一样的操作,只不过被volatile关键字修饰后,变量的改变会立刻更新到主内存!关于volatile关键字的具体讲解可参考《 》。除了volatile关键字,synchronized和final关键字也可以实现可见性哦!

“白话”可见性,原子性,有序性!Java并发必备知识几分钟就记住

可见性就像一个广播

什么是有序性

《深入了解Java虚拟机》中对有序性有一句经典的解释:如果在本线程内观察,所有的操作都是有序的;如果在一个线程中观察另一个线程,所有的操作都是无序的。这本书中也对这两句话进行了解释,前半句说的就是,在一个线程内会表现出串行的语义;后半句说的就是Java的“指令重排序”和“工作内存与主内存同步延迟”的现象,关于这两部分的具体解释可以参考小编之前的文章。

在Java中,保证有序性可以使用volatile和synchronized两个关键字来实现。volatile禁止了指令重排序来保证有序性,synchronized则是保证了持有同一个锁的两部分代码只能串行进入。

“白话”可见性,原子性,有序性!Java并发必备知识几分钟就记住

有序性

关于可见性,原子性,有序性的讲解就到这里,小伙伴们有没有发现,synchronized是万能的,不管是可见性,还是原子性,甚至是有序性,synchronized都可以搞定!。

有任何问题,小伙伴们都可以在评论中留言与小编进行交流,欢迎收藏、转发和关注哦!

老规矩,程序员鼓励师!

“白话”可见性,原子性,有序性!Java并发必备知识几分钟就记住

可能是一个女生程序员


分享到:


相關文章: