什么是线程安全性?
Posted z00377750
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是线程安全性?相关的知识,希望对你有一定的参考价值。
线程安全性
线程安全性定义:
当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。
三个特征
Java内存模型是围绕着在并发过程中如何处理原子性、可见性和有序性这3个特征来建立的。
原子性
原子性:是指一个操作或多个操作要么全部执行,且执行的过程不会被任何因素打断,要么就都不执行。
原子性提供了互斥访问,同一时刻只能有一个线程来对它进行操作
可见性
可见性:当一个线程修改了线程共享变量的值,其它线程能够立即得知这个修改。
一个线程对主内存的修改可以及时的被其他线程观察到。Java内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值这种依赖主内存作为传递媒介的方法来实现可见性的,无论是普通变量还是volatile变量都是如此。
有序性
有序性:即程序执行的顺序按照代码的先后顺序执行。
Java内存模型中的程序天然有序性可以总结为一句话:如果在本线程内观察,所有操作都是有序的;如果在一个线程中观察另一个线程,所有操作都是无序的。前半句是指“线程内表现为串行语义”,后半句是指“指令重排序”现象和“工作内存主主内存同步延迟”现象。
有序性的语意有几层,
- 最常见的就是保证多线程运行的串行顺序
- 防止重排序引起的问题
- 程序运行的先后顺序。比方JMM定义的一些Happens-before规则
参考资料:
以上是关于什么是线程安全性?的主要内容,如果未能解决你的问题,请参考以下文章