volatile

Volatile
Volatile关键字并不是java语言的特产,古老的C语言也有,它最原始的意义就是禁用CPU缓存。
我们先开下面一个列子
在这里插入图片描述
我们只用volatile关键字修饰了布尔类型的V,在执行write的方法时会将变量“V=true”写入内存,那么我们执行reader方法的时候,会从内存中读取变量v,V=true,那么此时变量X的值是多少呢?

这个要看java版本,如果在低于1.5版本上运行,x可能是88,也可能是0;如果在1.5以上的版本运行,x=88。因为变量X可能被CPU缓存而导致了可见性问题(1.5之前),java内存模型在1.5版本对volatile语义进行了增强(Happens-Before)规则

Happens-Before规则,前面一个操作的结果对于后续操作是可见的

1.**程序的顺序性规则:**这条规则是指前面的操作Happens-Before于后续的操作,程序前面对某个变量的修改一定是对后续操作可见的。

2.Volatile变量规则:这条规则是指对一个Volatile变量的写操作,Happens-Before 于后续对这个volatile变量的读操作。

3.传递性:这条规则是指如果A Happens-Before B,B Happens-Before C,那么 A Happens-Before C
a.X=88 Happens-Before v=true
b.写变量v=true Happens-Before 读取变量 V=true
根据传递规则:可以得到结果:X=42 Happens-Before 读取变量 V=true,如果B线程读到了 V=true ,那么线程A设置的 x=88 对线程B是可以见的

4.管程中锁的规则:这条规则是指对一个锁的解锁Happens-Before 于后续对这个锁的加锁

管程是一种通用的同步原语,在java中指的就是synchronized,synchronized是java里对管程的实现

管程中的锁在java中是隐式实现的,例如下面的代码,在进入同步块之前,回自动加锁,在代码执行完之后会自动释放锁,加锁以及释放锁都是编译器帮我们实现的

//加锁
synchronized (this) { // 此处自动加锁
  if (this.x < 12) {
    this.x = 12; 
  }  
} // 此处自动解锁

5.线程Start原则
他指在主线程A中启动子线程B,那么子线程B能够看到主线A在启动子线程之前的操作。

6.线程Join原则
如果在线程A中调用线程B的Join方法并成功返回,那么线程B中的任意操作Happens-Before join方法之前,那么主线程也就可以看到子线程的操作 ,看到指的是对共享变量的操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值