java+volatile关键使用_java – 使用volatile关键字与可变对象

这是一些关于volatile的一些细节的旁注说明。在这里写这是因为它是太多的评论。我想给出一些示例,显示易变性如何影响可见性,以及在jdk 1.5中如何改变。

给出以下示例代码:

public class MyClass

{

private int _n;

private volatile int _volN;

public void setN(int i) {

_n = i;

}

public void setVolN(int i) {

_volN = i;

}

public int getN() {

return _n;

}

public int getVolN() {

return _volN;

}

public static void main() {

final MyClass mc = new MyClass();

Thread t1 = new Thread() {

public void run() {

mc.setN(5);

mc.setVolN(5);

}

};

Thread t2 = new Thread() {

public void run() {

int volN = mc.getVolN();

int n = mc.getN();

System.out.println("Read: " + volN + ", " + n);

}

};

t1.start();

t2.start();

}

}

这个测试代码的行为在jdk1.5中有很好的定义,但是在jdk1.5之前没有很好的定义。

在前jdk1.5世界中,易失性访问和非易失性访问之间没有定义的关系。因此,该程序的输出可以是:

>读:0,0

>阅读:0,5

>阅读:5,0

>阅读:5,5

在jdk1.5世界中,易变性的语义被改变,使得易失性访问以与同步完全相同的方式影响非易失性访问。因此,在jdk1.5世界中只有某些输出是可能的:

>读:0,0

>阅读:0,5

>读:5,0< - 不可能

>阅读:5,5

输出3.是不可能的,因为从volatile _volN读取“5”在两个线程之间建立一个同步点,这意味着在分配到_volN之前从t1获得的所有动作必须在t2可见。

进一步阅读:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值