Java多线程——volatile详解
程序员文章站
2022-05-04 16:41:07
...
volatile的内存语义
(1)可见性
(2)禁止指令重排序
注:volatile的非原子性,在i++或i=i+1;会出现不安全。
可见性——缓存一致性协议
(1)Lock前缀指令会引起处理器缓存写到内存,线程的本地内存失效,别的线程只能从主存中读取数据。而本地内存的值会立马刷新到主存中去。(Lock又分为锁总线还是锁缓存)
(2)一个处理器的缓存回写到内存会导致其他处理器的缓存无效。
禁止指令重排序——内存屏障
volatile用途
检查某个状态标记以判断是否退出循环
public class Demo {
public volatile boolean run = false;
public static void main(String[] args) {
Demo d = new Demo();
new Thread(new Runnable() {
@Override
public void run() {
for(int i = 1;i<=10;i++) {
System.err.println("执行了第 " + i + " 次");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
d.run = true;
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while(!d.run) {
// 不执行
}
System.err.println("线程2执行了...");
}
}).start();
volatile和synchronized的区别?
(1)volatile保证变量的可见性,即只保证了对volatile变量读和写操作的原子性,并不能保证对i++这种复合操作的原子性。 而synchronized则是锁定当前临界资源,只有当前线程可以访问该资源,其他线程被阻塞住。保证了可见性和原子性。
(2)volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和代码块和类。
(3)volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
上一篇: 【题解】 Codeforces Round #503 A
下一篇: 国家统计局爬虫样例