当前位置: 代码迷 >> 综合 >> 线程六:volatile
  详细解决方案

线程六:volatile

热度:21   发布时间:2023-09-29 04:42:50.0

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

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

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

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

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

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

原文链接

  相关解决方案