ITPub博客

首页 > 应用开发 > Java > Java多线程 - volatile 关键字

Java多线程 - volatile 关键字

Java 作者:careerkr 时间:2025-11-27 17:16:16 0 删除 编辑

首先看一个例子

import java.util.concurrent.TimeUnit;
/**
 * @Author: Neco
 * @Description:
 * @Date: create in 2022/6/15 11:39
 */public class VisibilityDemo {
    public boolean flag = true;
    public static void main(String[] args) throws InterruptedException {
        VisibilityDemo demo = new VisibilityDemo();
        System.out.println("代码开始了~~~~");
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                int i = 0;
                while(demo.flag) {
                    i++;
                }
                System.out.println(i);
            }
        });
        thread.start();
        TimeUnit.SECONDS.sleep(2);
        demo.flag = false;
        System.out.println("flag 被置为 false 了");
    }
}

以上的代码,在不看运行结果的情况下,按照逻辑分析,最后的结果大致如下

代码开始了~~~~flag 被置为 false 了*** // 这里***表示某个值

但是实际的执行结果是这样的

代码开始了~~~~flag 被置为 false 了// 这里进入了死循环

volatile 关键字

·  可见性问题 让一个线程对共享变量的修改,能够及时的被其他线程看到。

·  Java内存模型规定: 对  volatile 变量v的写入,与所有其他线程后续对 v 的读同步

要满足以上条件,volatile关键字需要有以下的功能

1.****禁止缓存 volatile变量的访问控制符会加个ACC_VOLATILE  <u>https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.5</u>

2.****对 volatile** 变量相关的指令不做重排序** 即JVM在进行编译的时候,正常情况下,会在JVM规定的规范内,对指令进行重排序,以提高运行效率(性能),而对于volatile修饰的内容,则不会进行重新排序。

对于以上的问题,在flag变量前加入volatile关键字

public volatile boolean flag = true;

此时的执行结果

代码开始了~~~~
flag 被置为 false 了
30024084

扩展: Shared Variables 共享变量定义

可以在线程之间共享的内存称为 共享内存或堆内存。 所有 实例字段、 静态字段和 数组元素都存储在 堆内存中,这些字段和数组都是标题中提到的 共享变量。  冲突:如果 至少有一个访问是写操作,那么对同一个变量的两次访问是冲突的。 这些能被多个线程访问的 共享变量是内存模型规范的对象。

定义在:  <u>https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.4.1</u>

(顺便吆喝一句,民族企业核心部门年底前的一波岗,base武汉、深圳、苏州等地,前、后端or测试>>>机会;语言:Java、Js、测试、python、ios、安卓、C++等 <u>https://jsj.top/f/o38ijj</u>)!

作者:右耳菌
链接: https://www.jianshu.com/p/3c959c74a71c
来源:简书

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70048457/viewspace-3103747/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2025-11-21

  • 博文量
    61
  • 访问量
    69210