java volatile修饰引用_关于volatile修饰引用类型的疑惑

volatile修饰引用类型能否保证可见性似乎一直没有一个定论,有的书中说仅能保证引用本身的可见性,下面用两段代码来验证:流程基本为一个线程死循环读取某个引用类型的某个变量的值,另一个线程修改这个值,观察线程是否结束。

//volatile修饰类

public class TestVolatile implements Runnable{

class Foo {

boolean flag = true;

}

private volatile Foo foo = new Foo(); //

public void stop(){

foo.flag = false;

}

@Override

public void run() {

while (foo.flag){}

}

public static void main(String[] args) throws InterruptedException {

TestVolatile test = new TestVolatile();

Thread t = new Thread(test);

t.start();

Thread.sleep(1000);

test.stop();

}

}

//volatile修饰数组

public class TestVolatile2 implements Runnable{

private int len = 1024*1024;

volatile int[] arr = new int[len]; //

{

arr[len-1] = 1;

}

public void stop(){

arr[len-1] = 0;

}

@Override

public void run() {

while (arr[len-1] == 1){}

}

public static void main(String[] args) throws InterruptedException {

TestVolatile2 test = new TestVolatile2();

Thread t = new Thread(test);

t.start();

Thread.sleep(1000);

test.stop();

}

}

上面两段代码在有volatile字段的时候可观察到程序停止运行,没有volatile字段的时候会一直运行下去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值