volatile的心得

扫码查看
volatile 
1. 保证变量的可见性, 即 共享变量如果被其中一个线程给修改了,其他线程能够立即知道这个共享变量已经被修改了,当其他线程要读取这个变量的时候,最终会去内存中读取,而不是从自己的工作空间中读取.
2. 保证变量的有序性, 即 保证这个变量之前的代码一定会比它先执行,而之后的代码一定会比它后执行
, 编译器不会对此变量前后的代码进行重排序优化.

但  volatile 不能 完全保证一个变量的线程安全

volatile关键字不一定能够保证线程安全的问题,其实,在大多数情况下volatile还是可以保证变量的线程安全问题的。所以,在满足以下两个条件的情况下,volatile就能保证变量的线程安全问题:

  1. 运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值。
  2. 变量不需要与其他状态变量共同参与不变约束
参考  https://www.cnblogs.com/kubidemanong/p/9505944.html 

==========================================================
==========================================================
==========================================================
https://blog.csdn.net/csdn1126274345/article/details/82315867
延伸: linux 下可保证原子操作的变量
信号量和互斥量

线程的信号量是一种特殊的变量,它可以被增加或减少,但对其的关键访问被保证是原子操作。
如果一个程序中有多个线程试图改变一个信号量的值,系统将保证所有的操作都将依次进行。
信号量一般常用于保护一段代码,使其每次只被一个执行线程运行。
信号量是用来调协线程对共享资源的访问的。

通过使用信号量可以很好的完成线程同步。

信号量和互斥锁(mutex)的区别:互斥锁只允许一个线程进入临界区,而信号量允许多个线程同时进入临界区


10-26 02:56
查看更多