java关键技术概括_简要概述java内存模型,以及volatile关键字

如果我们要想深入了解Java并发编程,就要先理解好Java内存模型。Java内存模型定义了多线程之间共享变量的可见性以及如何在需要的时候对共享变量进行同步。原始的Java内存模型效率并不是很理想,因此Java1.5版本对其进行了重构,现在的Java8仍沿用了Java1.5的版本。

在java中每个线程都有一块本地内存,而本地内存存放的变量是主内存的副本。相当于在线程启动时候线程会复制主内存的变量到自己的本地内存。当本地内存变量改变时候就同步到主内存。如果有多个变量线程共享变量,这时候主内存又会刷新同步所有线程的变量。而这种同步并不是实时的。

3704a50457d1492e98d71402c5ed170b.png

如何和证明每个线程内部都有一份主内存副本?

下面有段代码

package com.mylienkd;

public class MyThread implements Runnable {

private Integer nubmer=0;

@Override

public void run() {

while(true){

if(nubmer>1){

System.out.println(Thread.currentThread()+"子线程循环结束");

break;

}

}

}

public void setNubmer(Integer nubmer) {

this.nubmer = nubmer;

}

public static void main(String[] args) throws Exception {

MyThread thread=new MyThread();

new Thread(thread).start();

//睡眠1s

Thread.sleep(1000);

thread.setNubmer(10);

//睡眠3s

Thread.sleep(3000);

System.out.println("主线程结束");

}

}

在此运行此代码得到如下结果

72daa875a4ae046bbf3b0ea29010a80f.png

仔细观察代码以及结果可以发现,在主线程更改变量nubmer为10后,主线程执行结束,但是控制台并没退出一直在执行。

这是因为子线程并没有退出循环。因为子线程本地内存的number为0,主内存中的值并没有刷新到子线程中的本内存的所以才会出现这种状态。

如何解决此方法。java为了避免这种情况提供了关键字volatile ,在number变量上加上volatile关键字

private volatile Integer nubmer=0;

运行此代码得到结果

c74a20ce6bca6c1c9f67d78835aabd81.png

可以看到此代码在主线程退出前,子线程就先退出了循环。这是因为volatile关键字实时更新此变量。在number变量更改时,就同步刷新更改其他线程的副本变量。

在很多地方叫做volatile关键字解决可见性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值