JAVA线程的工作内存

来源:互联网 发布:linux常见的服务器配置 编辑:程序博客网 时间:2024/06/05 22:39

首先,先传代码,有图片,也有文件,看不清的朋友可以直接下载文件回去跑一下,感受一下。



我解释一下吧,大概意思就是在一个线程里面不断的跑,如果a=0,就把a加到5,然后建立子线程,再在子线程里面把a减到0。预想的结果是这个循环会无限的执行打印语句,但是事实上,并没有。因为进不去 if 语句。也就是说,虽然子线程把a减到了0,主存中的a等于0,但是在main里面new出来的线程里面的a不等于0。

这是线程的工作内存问题,不知道工作内存的去百度吧,这里就不赘述了。我直接说解决方案吧:

多线程中的变量,都要上锁,无论是读还是写。在线程进入synchronized块之前,会把工作存内存中的所有内容映射到主内存上,然后把工作内存清空再从主存储器上拷贝最新的值。而在线程退出synchronized块时,同样会把工作内存中的值映射到主内存(例子是因为if中的读操作没有用synchronized,导致数据不一致)

读如果不上锁也行,但是a变量要声明为volatile。

使用atomic包,简单粗暴





0 1
原创粉丝点击