当前位置: 首页 > news >正文

java多线程 -- volatile 关键字 内存 可见性

内存可见性(Memory Visibility)

1 内存可见性(Memory Visibility)是指当某个线程正在使用对象状态而另一个线程在同时修改该状态,需要确保当一个线程修改了对象状态后,其他线程能够看到发生的状态变化。

2 可见性错误是指当读操作与写操作在不同的线程中执行时,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。我们可以通过同步来保证对象被安全地发布。除此之外我们也可以使用一种更加轻量级的 volatile 变量。

volatile 关键字

Java 提供了一种稍弱的同步机制,即 volatile 变量,用来确保将变量的更新操作通知到其他线程。
可以将 volatile 看做一个轻量级的锁,但是又与锁有些不同:

对于多线程,不是一种互斥关系
不能保证变量状态的“原子性操作”

1,不使用volatile 

package com.wangfubin;

public class Main {
    public static void main(String[] args){
        MyThread td=new MyThread();
        new Thread(td).start();
        while(true){
            if(td.isFlag()){
                System.out.println("-----------");
                break;
            }
        }
    }

}
class MyThread implements Runnable{
    private  boolean flag=false;
    public void run() {
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        flag=true;
        System.out.println("flag="+isFlag());
    }
    public boolean isFlag(){
        return flag;
    }
    public void setFlag(boolean flag){
        this.flag=flag;
    }
}

2,使用volatile

package com.wangfubin;

public class Main {
    public static void main(String[] args){
        MyThread td=new MyThread();
        new Thread(td).start();
        while(true){
            if(td.isFlag()){
                System.out.println("-----------");
                break;
            }
        }
    }

}
class MyThread implements Runnable{
    private volatile boolean flag=false;
    public void run() {
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        flag=true;
        System.out.println("flag="+isFlag());
    }
    public boolean isFlag(){
        return flag;
    }
    public void setFlag(boolean flag){
        this.flag=flag;
    }
}

相关文章:

  • Solaris 9 Sparc下安装整合Apache2和Tomcat5
  • axis和axis2的一些发布差异(WSDL2Java)
  • 孙卫琴的《精通Vue.js》读书笔记-组件的递归
  • 微信支付服务商模式(电商收付通)实现分账操作
  • LeetCode 946 验证栈序列[栈 模拟] HERODING的LeetCode之路
  • 第十七天计算机视觉之光学字符识别基础理论
  • 混迹职场10多年的数据开发老鸟,居然被一个职场新人上了一课
  • PHP - AJAX 与 PHP
  • 微服务项目调用外部接口
  • 【Python】第八课 异常处理
  • Atomic Mail Sender 9.6.X 中文版Crack
  • 【重识云原生】第六章容器6.1.4节——Docker核心技术LXC
  • mysql—自增长和索引
  • 【C语言】带你深入剖析字符串相关知识(详细讲解+源码展示)
  • PostgreSQL 常用管理命令
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 《Java编程思想》读书笔记-对象导论
  • angular2开源库收集
  • Angular6错误 Service: No provider for Renderer2
  • chrome扩展demo1-小时钟
  • exif信息对照
  • Git同步原始仓库到Fork仓库中
  • python学习笔记-类对象的信息
  • React-redux的原理以及使用
  • React中的“虫洞”——Context
  • 阿里云购买磁盘后挂载
  • 前端面试总结(at, md)
  • 积累各种好的链接
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • (1)(1.11) SiK Radio v2(一)
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (Java数据结构)ArrayList
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (接口自动化)Python3操作MySQL数据库
  • (南京观海微电子)——COF介绍
  • (全注解开发)学习Spring-MVC的第三天
  • (生成器)yield与(迭代器)generator
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (十三)Flask之特殊装饰器详解
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转)3D模板阴影原理
  • (转)h264中avc和flv数据的解析
  • .htaccess配置常用技巧
  • .Net 6.0 处理跨域的方式
  • .NET 常见的偏门问题
  • .net的socket示例
  • .NET关于 跳过SSL中遇到的问题
  • []我的函数库
  • [8481302]博弈论 斯坦福game theory stanford week 1
  • [Android] 修改设备访问权限
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)
  • [FT]chatglm2微调