1. 保证变量的可见性, 即 共享变量如果被其中一个线程给修改了,其他线程能够立即知道这个共享变量已经被修改了,当其他线程要读取这个变量的时候,最终会去内存中读取,而不是从自己的工作空间中读取.
2. 保证变量的有序性, 即 保证这个变量之前的代码一定会比它先执行,而之后的代码一定会比它后执行, 编译器不会对此变量前后的代码进行重排序优化.
但 volatile 不能 完全保证一个变量的线程安全
volatile关键字不一定能够保证线程安全的问题,其实,在大多数情况下volatile还是可以保证变量的线程安全问题的。所以,在满足以下两个条件的情况下,volatile就能保证变量的线程安全问题:
- 运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值。
- 变量不需要与其他状态变量共同参与不变约束。
==========================================================
==========================================================
==========================================================
https://blog.csdn.net/csdn1126274345/article/details/82315867
延伸: linux 下可保证原子操作的变量
信号量和互斥量
线程的信号量是一种特殊的变量,它可以被增加或减少,但对其的关键访问被保证是原子操作。
如果一个程序中有多个线程试图改变一个信号量的值,系统将保证所有的操作都将依次进行。
信号量一般常用于保护一段代码,使其每次只被一个执行线程运行。
信号量是用来调协线程对共享资源的访问的。
通过使用信号量可以很好的完成线程同步。
信号量和互斥锁(mutex)的区别:互斥锁只允许一个线程进入临界区,而信号量允许多个线程同时进入临界区