JAVA里面进行多线程通信的主要方式就是 共享内存 的方式,共享内存主要的关注点有两个:可见性 和 有序性。加上复合 *** 作的 原子性,可以认为JAVA的线程安全性问题主要关注点有3个(JAVA内存模型JMM解决了可见性和有序性的问题,而锁解决了原子性的问题):可见性、有序性、原子性
- 原子性(Atomicity):在Java中原子性指的是一个或多个 *** 作要么全部执行成功要么全部执行失败
- 有序性(Ordering):程序执行的顺序按照代码的先后顺序执行(处理器可能会对指令进行重排序)
- 可见性(Visibility):指在多线程环境下,当一个线程修改了某一个共享变量的值,其它线程能够立刻知道这个修改
① 重排序
指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。从JAVA源码到最终实际执行的指令序列,会经历下面3种重排序(主要流程):
指令重排序分类
- 编译器优化的重排序:编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序;
- 指令级并行的重排序:现代处理器采用了指令级并行技术来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序;
- 内存系统的重排序:由于处理器使用缓存和读/写缓冲区,这使得加载和存储 *** 作看上去可能是在乱序执行的。
② 顺序一致性
顺序一致性内存模型是一个理论参考模型,在设计的时候,处理器的内存模型和编程语言的内存模型都会以顺序一致性内存模型作为参照。顺序一致性特征如下:
- 一个线程中的所有 *** 作必须按照程序的顺序来执行
- (不管程序是否同步)所有线程都只能看到一个单一的 *** 作执行顺序。在顺序一致性的内存模型中,每个 *** 作必须原子执行并且立刻对所有线程可见
下一篇:J.U.C-2.Unsafe
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)