欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java多线程——volatile详解

程序员文章站 2022-05-04 16:41:07
...

volatile的内存语义

(1)可见性

(2)禁止指令重排序

注:volatile的非原子性,在i++或i=i+1;会出现不安全。

可见性——缓存一致性协议

Java多线程——volatile详解

(1)Lock前缀指令会引起处理器缓存写到内存,线程的本地内存失效,别的线程只能从主存中读取数据。而本地内存的值会立马刷新到主存中去。(Lock又分为锁总线还是锁缓存)

(2)一个处理器的缓存回写到内存会导致其他处理器的缓存无效。

禁止指令重排序——内存屏障

Java多线程——volatile详解

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可能会造成线程的阻塞。