当前位置: 代码迷 >> 综合 >> 多线程 Volatile 关键字
  详细解决方案

多线程 Volatile 关键字

热度:41   发布时间:2023-11-02 05:11:44.0

Volatile 关键字的作用是变量在多个线程之间可见,但不保证数据的原子性

代码:

package com.jvm.test;class ThreadVolatileDemo extends Thread {public boolean flag = true;@Overridepublic void run() {System.out.println("开始执行子线程....");while (flag) {}System.out.println("线程停止");}public void setRuning(boolean flag) {this.flag = flag;}}public class ThreadVolatile {public static void main(String[] args) throws InterruptedException {ThreadVolatileDemo threadVolatileDemo = new ThreadVolatileDemo();threadVolatileDemo.start();Thread.sleep(3000);threadVolatileDemo.setRuning(false);System.out.println("flag 已经设置成false");Thread.sleep(1000);System.out.println(threadVolatileDemo.flag);}
}

运行结果:

注意虽然将结果设置为fasle但是还一直在运行

原因:线程之间是不可见的,读取的是副本,没有及时读取到主内存结果。

解决办法使用Volatile关键字将解决线程之间可见性, 强制线程每次读取该值的时候都去“主内存”中取值

添加Volatile关键字后:

运行结果:

正常结束

 

volatile与synchronized区别

仅靠volatile不能保证线程的安全性。(原子性)

volatile轻量级,只能修饰变量。synchronized重量级,还可修饰方法

volatile只能保证数据的可见性,不能用来同步,因为多个线程并发访问volatile修饰的变量不会阻塞。

synchronized不仅保证可见性,而且还保证原子性,因为,只有获得了锁的线程才能进入临界区,从而保证临界区中的所有语句都全部执行。多个线程争抢synchronized锁对象时,会出现阻塞。

  相关解决方案