volatile关键字主要作用与使用

volatile关键字用于解决线程间数据的可见性问题,确保多线程环境下线程本地内存与主内存的数据同步。当未使用volatile时,线程可能会因未看到变量的最新状态而导致线程安全问题。而在使用volatile后,虽然它不保证原子性,但能确保变量的修改对其他线程可见。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.作用

实现线程本地内存与主内存之间的数据更新,实现各线程本地内存的数据操作,可以向主内存中数据一样可以共享。

1未使用volatile关键字

package ThreadVolatile;

import com.sun.jna.platform.win32.FlagEnum;
import com.zx.threadlock.threadDemo;

public class VolatileDemo {
	public static void main(String[] args) throws InterruptedException {
		Thread1 t1 = new Thread1();
		t1.start();
		Thread.sleep(300);
		t1.isRun(false);
	}
}

class Thread1 extends Thread{
	public boolean flag = true;
	@Override
	public void run() {
		System.out.println("子线程开始执行");
		while(flag) {
			
		}
		System.out.println("子线程结束执行");
	}
	
	public void isRun(boolean flag) {
		this.flag = flag;
	}
}

执行结果

线程一直执行
线程持续执行,未能结束。isRun方法未能将flag设置为的false的状态共享,主线程未能获得变化,所以一直以true执行,出现线程安全问题。

修改变量flag的关键字volatile

class Thread1 extends Thread{
	public volatile boolean flag = true;
	@Override
	public void run() {
		System.out.println("子线程开始执行");
		while(flag) {
			
		}
		System.out.println("子线程结束执行");
	}
	
	public void isRun(boolean flag) {
		this.flag = flag;
	}
}

执行结果

在这里插入图片描述
子线程成功结束

2分析

java内存模型

在这里插入图片描述
因为线程之间开始默认为不可见的,所以在线程t1调用isRun方法,将flag设置为false时,主线程没有获取到更新,从而使得主线程一直以flag为true执行,使得子线程无法关闭,在使用volatile关键字后,flag为可见,主内存可以获得子线程中本地内存对flag数据的操作结果。

volatile非原子性

线程三大大特性之一的是原子性,为保证数据的一致性来确保线程安全。volatile主要作用为更新本地内存中的数据,并不会保证操作的原子性。volatile非原子性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值