volatile初识

本文详细介绍了Java中Volatile关键字的作用及使用场景。通过一个具体的多线程示例,阐述了在没有使用Volatile修饰符时,线程间的变量更新无法同步的问题。并通过加入Volatile关键字后,成功解决了线程间的数据同步问题。

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

volatile 主要用于修饰变量 如:volatile private boolean istrue=true;
在多线程环境中,每个线程会有自己的私有内存空间。而且在运行时,如果在jvm 的server服务模式下,线程会只读自己内存的数据。在此条件下,如果没有加入volatile修饰变量,即使变量值发生变化,线程也不会读取到(公共堆与线程私有堆数据不统一)。
如下实例:
线程代码;

public class ThreadC extends Thread{
  private boolean isRunning=true;
  public boolean isRuning(){
	  return isRunning;
  }
public void setRunning (boolean isRunning){
	this.isRunning=isRunning;
}  
public void run (){
	System.out.println("进入run了");
	while(isRunning==true){
		
	}
	System.out.println("线程被停止了");
}

启动代码:

public static void main(String[] args) {

try {
	ThreadC c=new ThreadC();
	c.start();
	Thread.sleep(1000);
	c.setRunning(false);
	System.out.println("已赋值");
} catch (InterruptedException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}

运行结果为:
程序在while处一直循环,并未跳出,虽然isrunning值已改变
可见程序在while处一直循环,并未跳出,虽然isRunning值已改变。但是只是公共堆中的值改变了。

如果加上volatile 修饰isRunning变量呢?

public class ThreadC extends Thread{
//****加入volatile修饰******
  volatile private boolean isRunning=true;
  public boolean isRuning(){
	  return isRunning;
  }
public void setRunning (boolean isRunning){
	this.isRunning=isRunning;
}  
public void run (){
	System.out.println("进入run了");
	while(isRunning==true){
		
	}
	System.out.println("线程被停止了");
}

再次运行程序,结果如图:

在这里插入图片描述
可见线程停止了,程序跳出while死循环。说明线程的私有堆值被强制同步了。


我出身贫寒,从小就得到穷人三宝:每一餐饭都吃得下,每一晚都睡得着觉,每一天都笑得出来。----林清玄


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值