为什么在多核多线程程序中要慎用volatile关键字
1个回答
展开全部
因为volatile并不能保证其原子性,他只保证了某一个线程对他修改以后其他线程可见,
尤其是当多个线程对一个变量自增活自减时会导致变量出错。
参照《深入理解java虚拟机》一书,volatile运用在以下场景:
1>运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值。
2>变量不需要与其他的状态变量共同参与不变约束(表示看不懂这句)。
因此,在使用volatile关键字时要慎重,并不是只要简单类型变量使用volatile修饰,对这个变量的所有操作都是原来操作,当变量的值由自身的 上一个决定时,如n=n+1、n++等,volatile关键字将失效,只有当变量的值和自身上一个值无关时对该变量的操作才是原子级别的,如n = m+1,这个就是原级别的。所以在使用volatile关键时一定要谨慎,如果自己没有把握,可以使用synchronized来代替volatile。
尤其是当多个线程对一个变量自增活自减时会导致变量出错。
参照《深入理解java虚拟机》一书,volatile运用在以下场景:
1>运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值。
2>变量不需要与其他的状态变量共同参与不变约束(表示看不懂这句)。
因此,在使用volatile关键字时要慎重,并不是只要简单类型变量使用volatile修饰,对这个变量的所有操作都是原来操作,当变量的值由自身的 上一个决定时,如n=n+1、n++等,volatile关键字将失效,只有当变量的值和自身上一个值无关时对该变量的操作才是原子级别的,如n = m+1,这个就是原级别的。所以在使用volatile关键时一定要谨慎,如果自己没有把握,可以使用synchronized来代替volatile。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询