Java多线程可见性(一)

来源:互联网 发布:sql 奖学金加200 编辑:程序博客网 时间:2024/06/14 23:04

一:内存可见性
线程对共享变量的修改,可以及时的被其他线程看到。
那何为共享变量呢?就是在多个线程的工作内存中存在
如下图所示:所谓的共享变量就是主内存中名为S的变量,程序中所有的变量都会存储在主内存中;其他线程也会有自己的工作内存,此工作内存的作用是为线程与主内存之间建立桥梁
这里写图片描述
由此图总结如下:
1:其他线程不可以直接访问主内存中的变量,必须先与自己的工作内存进行交互再由工作内存与主内存进行交互。
2:不同线程之间无法直接访问其他线程工作内存中的变量,线程间变量值的传递需通过主内存来完成。
3:主内存作为其他线程之间相交互的桥梁,线程1中更改共享变量想被其他线程及时看到,则需要工作内存1将更新的值刷新到主内存中,由主内存将最新的共享变量值更新到工作内存2中
如下图所示:
这里写图片描述
二:可见性实现方式
1:synchronized
线程解锁:退出synchronized代码块时,主内存中的共享变量为最新值
线程加锁:进入synchronized代码块时,清空工作内存中共享变量的值,从而使用时从主内存中重新读取最新值
注:线程解锁前对共享变量的修改在下次加锁时对其他线程可见
实现可见性步骤:
获取互斥锁 - - >清空工作内存 –>从主内存拷贝变量的最新副本到工作内存 –>执行代码 –>将更改后的共享变量刷新到主内存 – >释放互斥锁

原创粉丝点击