volatile可见性案例-黑马

volatile可见性案例-黑马

package com.mozq.demo.demo;

class Task implements Runnable{
    //public boolean flag = false;//存在可见性问题,主线程无法监视到线程执行成功。
    public volatile boolean flag = false;

    @Override
    public void run() {
        if(!flag){
            System.out.println("执行任务");
        }
        flag = true;
        System.out.println("任务执行完毕");
    }
}

public class HeiMaVolatileTest {
    public static void main(String[] args) {
        Task task = new Task();
        new Thread(task).start();
        while (true){
            if(task.flag){
                System.out.println("=success=");
            }
        }
    }
}

运行结果

# 主线程获取的flag始终是false,不会打印success。
Connected to the target VM, address: '127.0.0.1:21030', transport: 'socket'
执行任务
任务执行完毕

原文地址:https://www.cnblogs.com/mozq/p/12038732.html

时间: 2024-08-05 03:02:45

volatile可见性案例-黑马的相关文章

volatile可见性的一些认识和论证

一.前言 volatile的关键词的使用在JVM内存模型中已是老生常谈了,这篇文章主要结合自己对可见性的一些认识和一些直观的例子来谈谈volatile.文章正文大致分为三部分,首先会介绍一下happen-before,接着讲解volatile的一些使用场景,最后会附上一些例子来论证使用与不使用volatile的区别. 二.happen-before 对操作系统有认识的同学一定知道,CPU一般有三级缓存,在与内存交互的时候,存在缓存与内存的更新问题,其次CPU在读取指令的时候,会做一些指令重排序的

Java并发编程-volatile可见性的介绍

前言 要学习好Java的多线程,就一定得对volatile关键字的作用机制了熟于胸.最近博主看了大量关于volatile的相关博客,对其有了一点初步的理解和认识,下面通过自己的话叙述整理一遍. 有什么用? volatile主要对所修饰的变量提供两个功能 可见性 防止指令重排序 <br>本篇博客主要对volatile可见性进行探讨,以后发表关于指令重排序的博文. 什么是可见性? 一图胜千言上图已经把JAVA内存模型(JMM)展示得很详细了,简单概括一下 每个Thread有一个属于自己的工作内存(

volatile 可见性的模拟分析示例

volatile 作为java的关键字之一,必然有它存在的必要性:在很多的资料中,各位大神级的人物都对volatile做了深入的分析,在这里就不在赘述了:不清的朋友可以迁移到这个地址详细了解:https://www.cnblogs.com/dolphin0520/p/3920373.html 那么已经了解volatile的作用.这里呢?将使用java代码将把volatile底层 "可见性"给扩大,并已代码的形式展示,volatile的可见性到底是怎么一回事: 注意:本人亦不清楚vola

volatile变量

一.volatile概述 volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址(内存)中读取数据.如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象.下面举例说明. volatile一般用于修饰多线程间被多个任务共享的变量和并行设备硬件寄存器等. 二.volatile使用案例 在DSP开发中,经常需要等待某个事件的触发,所以经常会写

【死磕Java并发】-----Java内存模型之分析volatile

前篇博客[死磕Java并发]-–深入分析volatile的实现原理 中已经阐述了volatile的特性了: volatile可见性:对一个volatile的读,总可以看到对这个变量最终的写: volatile原子性:volatile对单个读/写具有原子性(32位Long.Double),但是复合操作除外,例如i++; JVM底层采用"内存屏障"来实现volatile语义 下面LZ就通过happens-before原则和volatile的内存语义两个方向介绍volatile. volat

13、Java并发性和多线程-Java Volatile关键字

以下内容转自http://tutorials.jenkov.com/java-concurrency/volatile.html(使用谷歌翻译): Java volatile关键字用于将Java变量标记为“存储在主存储器”中.更准确地说,这意味着,每个读取volatile变量将从计算机的主存储器中读取,而不是从CPU缓存中读取,并且每个写入volatile变量的写入将被写入主存储器,而不仅仅是写入CPU缓存. 实际上,由于Java 5的volatile关键字保证不仅仅是volatile变量被写入

Java 并发编程:volatile的使用及其原理

Java并发编程系列[未完]: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程:线程间的协作(wait/notify/sleep/yield/join) Java 并发编程:volatile的使用及其原理 一.volatile的作用 在<a href="http://www.cnblogs.com/paddix/p/5374810.html">&

Java并发编程--Volatile详解

摘要 Volatile是Java提供的一种弱同步机制,当一个变量被声明成volatile类型后编译器不会将该变量的操作与其他内存操作进行重排序.在某些场景下使用volatile代替锁可以减少代码量和使代码更易阅读.   Volatile特性 1.可见性:当一条线程对volatile变量进行了修改操作时,其他线程能立即知道修改的值,即当读取一个volatile变量时总是返回最近一次写入的值 2.原子性:对于单个voatile变量其具有原子性(能保证long double类型的变量具有原子性),但对

Java多线程之synchronized和volatile的比较

概述 在做多线程并发处理时,经常需要对资源进行可见性访问和互斥同步操作.有时候,我们可能从前辈那里得知我们需要对资源进行 volatile 或是 synchronized 关键字修饰处理.可是,我们却不知道这两者之间的区别,我们无法分辨在什么时候应该使用哪一个关键字.本文就针对这个问题,展开讨论. 版权说明 著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 本文作者:Coding-Naga 发表日期: 2016年4月5日 本文链接:http://blog.csdn.net/