线程六:volatile

volatile只能解决可见性问题,不能解决互斥问题,通常程序使用它作为状态标签,看一个实例:

java程序员修炼之路线程篇六:volatile

程序中定义了停止线程的stopThread方法,以便于程序能通过此方法结束线程的运行。但是由于每个线程都有自己的变量拷贝,所以在多核处理器上运行此程序时,可能看不到线程的结束。为了解决这个问题,我们可能想到使用synchronized来同步访问stoplab属性,看下面修改:

java程序员修炼之路线程篇六:volatile

遗憾的是,这不仅没有解决问题,还带来了新的问题。从结果上看不仅系统没有停止线程,反而线程st也没有被结束。因为当执行到while循环后,系统再也出不来了,当我们调用stopThread方法时会由于锁已被锁定而无法访问(上面的例子只是为了强调输出的结果,在处理方式上并不恰当,如果有问题的读者可以私信我)。为了解决问题,我们可能会采用下面的方式:

java程序员修炼之路线程篇六:volatile

这种方式虽然能解决问题,但是也带来了性能上的额外开销。这种情况下,volatile就显示出了它的优越性,看修改后的实例:

java程序员修炼之路线程篇六:volatile

使用volatile修饰stopped后,每个线程都会到主存中访问它而不是在缓存中访问,从而解决了问题。但是重要的一点是只有可见性问题时,我们才能使用volatile,它不具备互斥性。

另外java中可以多线程安全地访问final属性,这也就意味着final和volatile没有同时使用的必要了。除了final属性,final的对象在java中也提供了线程安全的保障,不可变的对象也有三点限制:不可变对象的状态是不能改变的、所有的属性都是final的、在构造器中不能使用this。

原文链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值