Java后端面试闲聊(一)(JUC,JMM可见性)(volatile)

JUC多线程及高并发

1.什么是volatile?
volatile是Java虚拟机提供的轻量级同步机制,有三大特性(必背),保证可见性;不保证原子性,禁止指令重排!
JVM(Java虚拟机)
JMM(Java内存模型)(接触高并发需要明白)
JMM是一种不存在的抽象概念,是一种习惯,规范,定义了程序中的各个变量的访问方式。
JMM关于同步的规定:
①线程解锁前,必须把共享变量的值刷新回主内存;
②线程加锁前,必须读取主内存的最新值到自己的工作内存(各自线程中的工作内存);
③加锁解锁是同一把锁。
线程对变量的操作必须是在工作内存中,首先要将变量从主内存拷贝到自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存中。
不同线程中的工作内存无法进行访问,线程之间的通信必须通过主内存来完成。
当线程中的共享变量传输到主内存时,其他线程需要同时知道变量已经修改,这就依靠JMM做到的可见性。

//可见性
class MyData{
	volatile int number = 0;
	public void addT060(){
		this.number = 60;
	}
}
//验证volatile可见性
//例如int number = 0;number变量之前根本没有加volatilea关键字修饰
public class VolatileDemo{
	public static void main(String[] args){
		Mydata mydata =  new MyData();
		new Thread(()->{System.out.println(Thread.currentThread().getName()+"\t come in");
		//暂停一会线程
		try{TimeUnit.SECONDS.sleep(3);}catch(InterruptedException e){e.printStackTrace();}
		MyData.addT060();
		System.out.println(Thread.currentThread().getName()+"\t update number value:"+
		myData.number)
		},"AAA").start();
		while(myData.number==0){
			//main线程一直在这里等待循环,直到number不再等于0
		}
		System.out.println(Thread.currentThread().getName+
		"\t mission is over,main get number value:"+myData.number);
	}
}

JMM有可见性,原子性,有序性,VolatileDemo代码演示可见性+原子性代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卑微-程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值