java多线程之共享变量的可见性、原子性

1.概述:
提到多线程,就不可避免地涉及到数据争用的问题。这包括了多线程对共享变量的可见性和原子性操作;(共享变量:如果一个变量在多个线程的工作内存(工作内存:每个线程都有自己的工作内存)中都存在副本,那么这个变量就是这几个线程的共享变量)
在java内存模型中,
a.所有变量都存储在主内存中
b.每个线程都有自己的独立工作内存,里面保存该线程使用到的变量的副本(也就是主内存中该变量的一份拷贝)
c.每个线程访问共享变量需要通过主内存中的转换

2.可见性
概念:一个线程对一个共享变量的修改,能及时地被其他线程看到。
体现(线程1对x的修改能及时被线程2看到):
步骤:
(1)主线程 x = 0 线程1 x1 =0 线程2 x2 = 0;
(2)主线程 x = 0 线程1 x1 =1 线程2 x2 = 0;线程1修改在该线程的共享变量副本x1 = 1
(3)主线程 x = 1 线程1 x1 =1 线程2 x2 = 0;线程1的共享变量副本x1 = 1,及时刷新到主内存中的共享变量x=1
(4)主线程 x = 1 线程1 x1 =1 线程2 x2 = 1;主内存中的共享变量x = 1,及时刷新到线程2中的共享变量副本x2 =1
要保证(3)、(4)同时满足,才能实现可见性;
实现:
java语言层面:
synchronized :线程加锁时,将清空工作内存共享变量的值,从主内存中读取最新值;
线程解锁时,将共享变量最新值刷新到主内存中。
volatile :

3.原子性
概念:当一个线程访问一个变量时,该操作不会被中断,保证数据操作是以原子方式进行的;
volatile不能保证原子性,可保证可见性:
volatile修饰的原始类型类似于一个小小的同步块,但是与同步块比起来,由于没有线程锁这样一个概念,所以在某些情况下还是得不到保证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值