说说怎么保证线程安全
Posted top啦它
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了说说怎么保证线程安全相关的知识,希望对你有一定的参考价值。
通过同步来保证线程安全。jjvm通过制定JMM(java内存模型)来屏蔽不同硬件在系统内存上操作的差异,通过一系列·规则实现jvm与内存协同操作。保证了可见性有序性、原子性。jmm本身的结构时不同于系统内存的,在JMM中存在堆栈,这些堆栈都存储在系统内存中,当有线程执行的时候才会加载到cpu缓存和寄存器中。线程的本地内存需要依赖于共享内存中的某些对象,本地内存与共享内存之间通过lock、read、load、use、assign、store、write、unlock等操作来实现数据的存取。可见性和有序性的保证可以通过volatile来保证。volatile在读数据的时候会先删除本地内存中的数据,然后再从共享内存中读取,当写数据的时候则会在写入共享内存后立刻删除所写入值所在缓存区的其他访问线程本地变量中的数据,使得他需要重新从共享内存中读取数据(不能保证原子性的原因)。volatile中read、load、use、assign、store、write必须是顺序完成的。volatile使用lock前缀指令来实现这些功能从而保证可见性,volatile使用到了内存屏障(storestore、storeLoad、loadstore、loadload)来禁止指令重排序、比如说在volatile写前面无论是任何操作都会保证有序性、在volatile读后面的任何操作也不会重排序,volatile写+volatile读也不会发生重排序。
什么是重排序:
代码-》编译器优化-》解释器优化-》内存系统优化-》执行的指令序列
以上是关于说说怎么保证线程安全的主要内容,如果未能解决你的问题,请参考以下文章