volatile关键字概览

2023-11-08

1、多线程下变量的不可见性

1.1 概述

在多线程并发执行下,多个线程修改共享的成员变量,会出现一个线程修改了共享变量的值后,另一个线程不能直接看到该线程修改后的变量的最新值。

package Ls;

import java.util.HashMap;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * ClassName: Main <br/>
 * Description: 目标:研究一下多线程下变量访问的不可见性现象
 * 准备内容:
 * 1、准备2个线程
 * 2、定义一个成员变量
 * 3、开启两个线程,其中一个线程负责修改,另外一个负责读取
 * date: 2021/6/28 20:51<br/>
 *
 * @author yiqi<br />
 * @since JDK 1.8
 */
public class Main {
    //main方法,作为一个主线程
    public static void main(String[] args) {
        //a.开启一个子线程
        MyThread t = new MyThread();
        t.start();

        //b.主线程执行
        while (true) {
            if (t.isFlag()) {
                System.out.println("主线程进入循环执行~~~~~");
            }
        }
    }
}

class MyThread extends Thread {

    //成员变量
    private boolean flag = false;

    @Override
    public void run() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //触发修改共享成员变量
        flag = true;
        System.out.println("flag=" + flag);
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }
}

1.2 执行结果

我们看到,子线程中已经将flag设置为true,但是main()方法中始终没有读到修改后的最新值,从而循环没有能进入到 if 语句中执行。所以没有任何打印。

1.3 小结

多线程下修改共享变量会出现变量修改值后的不可见性。

在了解多线程并发修改变量不可见现象的原因之前,我们需要了解一下java内存模型:JMM

 1.4 问题分析

 

可见性问题的原因

所有共享变量存在于主内存中,每个线程有自己的工作内存,而且线程读写共享数据也是通过本地内存交换的,所以才导致了可见性问题。

1.5 变量不可见性解决方案

如何实现在多线程下访问共享变量的可见性:也就是实现一个线程修改变量后,对其他线程可见呢?接下来为大家介绍两种方案:

第一种是加锁,第二种是使用volatile关键字

加锁

while (true) {
 synchronized (t) {
      if (t.isFlag()) {
         System.out.println("主线程进入循环执行~~~~~");
      }
   }
}

volatile关键字修饰

使用volatile关键字修饰该变量

private volatile boolean flag = false;

工作原理:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

volatile关键字概览 的相关文章

随机推荐

  • SetCallAsFunctionHandler 相当于lua __call

    首先到google开发者网站上下载v8源码 并按照说明进行编译 在v8中 编译和执行的js代码需要依付于一个空间 上下文 上下文由Context New创建 static Persistent
  • 微服务:什么是微服务?一篇文章让你彻底搞明白

    文章目录 前言 一 微服务介绍 1 什么是微服务 2 微服务由来 3 为什么需要微服务 3 1 早期的单体架构带来的问题 1 复杂性逐渐变高 2 技术债务逐渐上升 3 部署速度逐渐变慢 4 阻碍技术创新 5 无法按需伸缩 3 2 微服务与单
  • Testing-《软件测试》读书笔记(四)

    静态测试是指测试非运行部分 检查和审查 白盒测试是指访问代码 能够查看和审查 静态白盒测试实在不执行的条件下有条理地仔细审查软件设计 体系结构和代码 从而找出软件缺陷的过程 有时也成为结构分析 静态白盒测试的原因 首先是尽早发现软件缺陷 另
  • 机器学习框架/库

    本文汇编了一些机器学习领域的框架 库以及软件 按编程语言排序 C 计算机视觉 CCV 基于C语言 提供缓存 核心的机器视觉库 新颖的机器视觉库 OpenCV 它提供C C Python Java 以及 MATLAB接口 并支持Windows
  • Class 07 - 功能包的安装和 tidyverse 介绍

    Class 07 功能包的安装和 tidyverse 介绍 tidyverse 简介 功能包 package 的安装 tidyverse 的安装 功能包 package 的加载 tidyverse 的加载 功能包 package 的更新 t
  • Mac系统下搭建使用eclipse搭建web开发环境ATS阻止http发布的问题

    应课程要求 今天使用Mac搭建eclipse Tomcat mysql开发环境 在进行简单的jsp页面测试时出现如下情况 原因是苹果收紧对普通http的访问限制 需要关闭App Transport Security ATS 方法是在Info
  • 通讯协议025——全网独有的OPC AE知识四之接口(九)

    本文简单介绍OPC AE规范的OPCEventSubscription对象的相关知识 更多通信资源请登录网信智汇 wangxinzhihui com OPC AE规范描述了OPC事件服务器应该实现的对象和接口 实现在多个OPC客户端间共享事
  • 数字化时代-13:入住CSDN一个月进展报告

    摘要 入住CSDN一个月进展报告 1 数据汇总 积分 0 461 等级 1级别 3级 排名 66万 20万 访问量 0 8950 2 每周文章变化 3 每周访问重量变化 4 每周粉丝总计变 5 总积分变化
  • k8s发布系统的实现

    综述 本篇文章所介绍的内容 已经有完整的实现 可以参考这里 在微服务 DevOps和云平台流行的当下 使用一个高效的持续集成工具也是一个非常重要的事情 虽然市面上目前已经存在了比较成熟的自动化构建工具 比如jekines 还有一些商业公司推
  • seaborn库学习笔记

    导入seaborn库 因此一般直接导入相关库 import numpy as np import seaborn as sns import matplotlib pyplot as plt import pandas as np 整体布局
  • 密码学原语如何应用?解析密码学特有的数据编解码|第10论

    隐私保护方案的工程实现 如何关联到学术论文中天书一般的公式符号 密码学工程中 有哪些特有的数据编解码方式 存在哪些认知误区和注意事项 需要克服哪些限制和挑战 作为支撑隐私保护方案的核心技术 如何运用数据编解码 将密码学论文中抽象的数学符号和
  • 30 秒使用 Sealos 搭建个人密码管理器 Vaultwarden

    我与 LastPass 的曲折恋情 超过 8 年网龄的我 注册过很多网站帐号 每个网站的密码我都用不同的复杂密码 一开始我全靠脑力记忆这些密码 后来渐渐觉得记起来很困难 就记录在笔记本上 但是随着时间推移 我发现这种方法既不安全也不可靠 有
  • VS2010彻底卸载

    依照微软网站http msdn microsoft com zh tw library e2h7fzkw aspx 完整移除方法有两种 方法一 工具卸载 下载Microsoft Visual Studio 2010 Uninstall Ut
  • 机器学习(基于python数学基础)——概率统计篇(一)全概率与贝叶斯公式

    注 学习本篇前最好一定的数学基础 即学习过概率论与数理统计 这个问题是求全概率的 在这里我们给它加上一问求 取得正品且是甲厂生产的概率 import numpy as np H np array 1 2 3 10 2 10 完备事件组概率
  • 增强学习/强化学习 综述

    创建于 20210512 修改于 20210512 文章目录 1 增强学习概念 2 1 增强学习定义 2 2 两大特点 2 简书 阿阿阿阿毛 https www jianshu com u a18653721b40 3 知乎 叶强 http
  • Java程序员不得不会的面试题(含答案)

    每个技术人都有个大厂梦 我觉得这很正常 并不是饭后的谈资而是每个技术人的追求 像阿里 腾讯 美团 字节跳动 京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司 小公司 如果说能够在这样的公司锻炼几年 相信对自己能力的提升还是非常大的
  • 计算机文件路径的表示

    文件路径作为计算机基础内容 在很多时候都扮演着十分重要的角色 例如控制台命令 资源文件的存放等等 以下将介绍计算机文件路径的表示方法以及一些常见的使用场景 文件路径的表示分为两种方式 绝对路径表示法和相对路径表示法 绝对路径与相对路径的区别
  • node koa发送邮箱验证码

    1 注册一个邮箱 开启POP3 SMTP IMAP 下方代码内的auth pass 下图授权码 2 nodejs koa发送邮箱验证码 const nodemailer require nodemailer const userEmail
  • 【第六章】STM32单片机+NB-IoT模组BC95采集温湿度数据发到电信平台(下)

    相关信息 设备接入方式 CoAP非加密方式 应用开发 串口助手AT命令对接平台 这部分内容是通过电脑串口调试软件 手动发AT指令 直接发给NB IoT模块 NB模块返回的信息 直接到电脑串口调试软件 一步一步动手操作 实现连接OceanCo
  • volatile关键字概览

    1 多线程下变量的不可见性 1 1 概述 在多线程并发执行下 多个线程修改共享的成员变量 会出现一个线程修改了共享变量的值后 另一个线程不能直接看到该线程修改后的变量的最新值 package Ls import java util Hash