当你点开这篇文章,你可能会有点失望,因为这边文章用词不太官方,与在书上看到的东西不太一致。在这篇文章中的用词都会很“白话”,因为这些都是小编理解的总结,小编也会用最通俗的语言来介绍概念!
现在就开始介绍与Java并发相关的可见性,原子性,有序性!
如果没有接触过Java并发编程,可能很少会听过这三个性质。但是,当你开始接触并发编程后,理解了Java的内存模型,这三个性质就变得尤其重要!这里如果对内存模型不是很了解,可以参考小编的另外一篇文章《 》,那么今天小编就来介绍一下这三个性质的概念,这些概念可能和小伙伴们在书上看到的不同,但是,这一定是你最能看懂的概念了。
什么是原子性
学过化学的小伙伴应该都知道原子,原子在化学中是一种不可再分的粒子,也就是说,在化学中,原子就是最小的单位了。
在Java中,我们所说的原子性就和化学中所说的原子一样,都是一种不可再分的“粒子”。一个操作不能进行拆分,要么执行,要么不执行,这样的操作就是原子性操作!
在Java中,有些原子性变量的操作直接由Java的内存模型来保证,我们熟悉的基本数据类型(long和double除外)的访问、读、写操作都是原子性的。如果需要一些非原子性操作具备原子性,就需要程序员自行来控制了,可以利用lock/unlock、synchronized来保证原子性。
什么是可见性
可见性就更加通俗易懂了,就是变量的变化可以被看到!当一个线程修改了一个共享变量,其他线程立即可以知道这个修改,那么这个共享变量就是具备可见性的。具有可见性的变量就像被装上了一个大喇叭,只要发生改变,就进行广播。
在Java中,通过将修改后的变量值同步到主内存,在变量读取前从主内从刷新变量的方式实现可见性的。不仅仅是被volatile关键字修饰的变量是这样实现可见性的,普通的变量也是一样的操作,只不过被volatile关键字修饰后,变量的改变会立刻更新到主内存!关于volatile关键字的具体讲解可参考《 》。除了volatile关键字,synchronized和final关键字也可以实现可见性哦!
什么是有序性
《深入了解Java虚拟机》中对有序性有一句经典的解释:如果在本线程内观察,所有的操作都是有序的;如果在一个线程中观察另一个线程,所有的操作都是无序的。这本书中也对这两句话进行了解释,前半句说的就是,在一个线程内会表现出串行的语义;后半句说的就是Java的“指令重排序”和“工作内存与主内存同步延迟”的现象,关于这两部分的具体解释可以参考小编之前的文章。
在Java中,保证有序性可以使用volatile和synchronized两个关键字来实现。volatile禁止了指令重排序来保证有序性,synchronized则是保证了持有同一个锁的两部分代码只能串行进入。
关于可见性,原子性,有序性的讲解就到这里,小伙伴们有没有发现,synchronized是万能的,不管是可见性,还是原子性,甚至是有序性,synchronized都可以搞定!。
有任何问题,小伙伴们都可以在评论中留言与小编进行交流,欢迎收藏、转发和关注哦!
老规矩,程序员鼓励师!
閱讀更多 小六冷知識 的文章