public class Test {
    public static void main(String[] args){

    }
}

/*
    12.3 Java内存模型

    Java内存模型定义了线程与主内存之间的抽象关系:
        1.共享变量存储于主内存之中,每个线程都可以访问
        2.每个线程都有私有的工作内存
        3.工作内存只存储该线程对共享变量的副本
        4.线程不能直接操作主内存,只有先操作了工作内存之后才能写入主内存
        5.工作内存是一种抽象的概念,涵盖了缓存、寄存器、编译优化以及硬件
 */

/*
    13.1 并发编程的三个重要特性
        原子性:一次操作或者多次操作,要么所有的惭怍全部都得到了执行,并且不受任何
            因素的干扰而中断,要么所欲的操作都不执行
        可见性:当一个线程对共享变量进行了修改,那么另外的线程可以立即看到。
        有序性:程序代码在执行过程中的先后顺序。在多线成的情况下,如果有序性得不到
            保障,其结果是灾难性的。

    13.2.1 JMM与原子性

    y=x;
        1.执行线程从主内存读取x的值(如果x已经存在与执行线程的工作内存中,则直接获取)
            然后将其存入当前线程的工作内存中。
        2.在执行线程的工作内存中修改y的值为x。

    结论:
        1.多个原子性的操作在一起就不再是原子性操作了
        2.简单的读取与赋值操作是原子性的,将一个变量赋给另一个变量不是原子的
        3.JMM只保证了基本读取和赋值的原子性操作
 */

/*
    13.2.2 JMM与可见性

    Java三种方式保证可见性:
        1.使用关键字volatile,读,写两个方面
        2.使用关键字synchronized,同一时刻只有一个线程获得锁,且释放锁之前,
            会将对变量的修改刷新到主内存中
        3.通过JUC提供的显式锁Lock
 */

/*
    13.2.3 JMM与有序性

    方案同上。

    JMM具备一些天生的有序性规则,不需要任何同步手段就能够保证有序性,这个规则被称为
    Happens-before原则。如果两个操作的执行次序无法从happens-before原则推导出来,
    那么它们就无法保证有序性,也就是说JVM或者处理器可以任意对它们进行重排序出来。

    happens-before原则:
        1.程序次序原则:一个线程内,代码按照编写时的次序来执行,编写在后面的操作发生
            在编写在前面的操作之后。(JVM还是可能对程序代码进行重排序,只要确保一个
            线程内结果一致即可)
        2.锁定规则:一个unlock操作要先行发生于对同一个锁的lock操作。
        3.volatile变量原则:对一个变量的写操作要早与对这个变量的读操作。
        4.传递规则:如果操作a先于操作b,而操作b先与操作c,则可以得出操作a肯定先于
            操作c。happens-before原则具有传递性
        5.线程启动规则:Thread对象的start()方法先行于发生对该线程的任何动作。
        6.线程中断规则:对线程执行interrupt()方法肯定优先与捕获到中断信号。
        7.线程终结原则:线程任务的执行、逻辑单元执行肯定要发生于线程死亡之前
        8.一个对象初始化的完成先于finalize()方法之前。
 */

/*
    13.3.1 volatile关键字语义

    被volatile修饰的变量有:
        1.保证了不同线程之间对共享变量操作时的可见性
        2.进制对指令进行重排序操作

    (1)理解volatile保证可见性
    (2)理解volatile保证顺序性
    (3)理解volatile不保证原子性
        我觉得作者在将volatile不保证原子性时,举得例子前后都是矛盾的,前面一个例子都说了
        volatile在工作内存中对变量进行了修改后,会立即刷新到主内存中,导致其他工作内存中
        的备份失效。但是这个例子时又说线程B工作内存中为i执行了加1的操作,但是未刷新到至主
        内存中,这不是在搞笑么。这个例子又用到了后面写的类,我想做个实验都做不成,唉!
 */

/*
    13.3.3 volatile的使用场景

    (1)开关控制利用可见性的特点
            class ThreadConseale extends Thread{
                private volatile boolean started = true;

                public void run(){
                    while(started){
                        //do work
                    }
                }

                public void shutdown(){
                    this.started=false;
                }
            }
    (2)状态标记利用顺序性特点
    (3)Singleton设计模式的double-check也是利用顺序性特点。
 */

《Java高并发编程详解》笔记

Java volatile关键字小结的更多相关文章

  1. [Java并发编程(三)] Java volatile 关键字介绍

    [Java并发编程(三)] Java volatile 关键字介绍 摘要 Java volatile 关键字是用来标记 Java 变量,并表示变量 "存储于主内存中" .更准确的说 ...

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

    以下内容转自http://tutorials.jenkov.com/java-concurrency/volatile.html(使用谷歌翻译): Java volatile关键字用于将Java变量标 ...

  3. Java Volatile关键字(转)

    出处:  Java Volatile关键字 Java的volatile关键字用于标记一个变量“应当存储在主存”.更确切地说,每次读取volatile变量,都应该从主存读取,而不是从CPU缓存读取.每次 ...

  4. Java volatile 关键字底层实现原理解析

    本文转载自Java volatile 关键字底层实现原理解析 导语 在Java多线程并发编程中,volatile关键词扮演着重要角色,它是轻量级的synchronized,在多处理器开发中保证了共享变 ...

  5. Java volatile关键字详解

    Java volatile关键字详解 volatile是java中的一个关键字,用于修饰变量.被此关键修饰的变量可以禁止对此变量操作的指令进行重排,还有保持内存的可见性. 简言之它的作用就是: 禁止指 ...

  6. Java Volatile关键字

    在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写. 这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量 ...

  7. 从根源上解析 Java volatile 关键字的实现

    1.解析概览 内存模型的相关概念 并发编程中的三个概念 Java内存模型 深入剖析Volatile关键字 使用volatile关键字的场景 2.内存模型的相关概念 缓存一致性问题.通常称这种被多个线程 ...

  8. java volatile关键字解析

    volatile是什么 volatile在java语言中是一个关键字,用于修饰变量.被volatile修饰的变量后,表示这个变量在不同线程中是共享,编译器与运行时都会注意到这个变量是共享的,因此不会对 ...

  9. Java Volatile关键字 以及long,double在多线程中的应用

    概念: volatile关键字,官方解释:volatile可以保证可见性.顺序性.一致性. 可见性:volatile修饰的对象在加载时会告知JVM,对象在CPU的缓存上对多个线程是同时可见的. 顺序性 ...

随机推荐

  1. 使用Boost的DLL库管理动态链接库(类似于Qt中的QLibrary)

    Boost 1.61新增了一个DLL库,跟Qt中的QLibrary类似,提供了跨平台的动态库链接库加载.调用等功能.http://www.boost.org/users/history/version ...

  2. uwp汉堡菜单的实现

    ---恢复内容开始--- 现在uwp上面的汉堡菜单(就是那个三道杠,点击之后会出现菜单)使用的越来越普遍,比如微软自己家的Cortana.现在我使用的实现方法是使用SplitView实现.首先Spli ...

  3. QSocket 总体设计框架说明(观赏)

    QSocket 是 QDAC 开源组件的一个重要的组成部分,终于要开始开工了,为了方便大家了解 QSocket,对 QSocket 的总体设计的一些想法,我在这里给大家简要的描述一下. 首先,QSoc ...

  4. YxdIocp包含有支持大并发的TCP服务组件、HTTP服务组件、UDP服务组件、WebSocket服务组件

    Delphi Windows IOCP 通讯模型封装,基于DIOCP.YxdIocp包含有支持大并发的TCP服务组件.HTTP服务组件.UDP服务组件.WebSocket服务组件,和TCP.UDP等基 ...

  5. 用CMake 构建Qt 项目

    译:用CMake构建Qt项目作者: Johan Thelin  译者:赖敬文原链接:http://developer.qt.nokia.com/quarterly/view/using_cmake_t ...

  6. 海康威视频监控设备Web查看系统(三):Web篇

    声明:本系列文章只提供交流与学习使用.文章中所有涉及到海康威视设备的SDK均可在海康威视官方网站下载得到.文章中所有除官方SDK以为的代码均可随意使用,任何涉及到海康威视公司利益的非正常使用由使用者自 ...

  7. Java基础(五) final关键字浅析

    前面在讲解String时提到了final关键字,本文将对final关键字进行解析. static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提 ...

  8. 第五章 FISCO BCOS 区块链浏览器的部署

    想了解相关区块链开发,技术提问,请加QQ群:538327407 前提 前面我们已经通过底层部署.sdk调测.自定义智能合约编写与部署.联合单元测试调测,已经初步对FISCO BCOS的区块链底层和实际 ...

  9. Vim入门操作整理

    根据小甲鱼的vim入门视频整理,供查阅 移动指令:上下左右 k j h l 翻页: ctrl + b  ctrl + f 保存退出:ZZ 普通模式:vim fileName 首次进入的就是普通模式 从 ...

  10. SkyWorking基础:6.2版本安装部署

    就在今天,SkyWorking发布了6.2版本. 概述 什么是SkyWorking SkyWalking是观察性分析平台和应用性能管理系统. 提供分布式追踪.服务网格遥测分析.度量聚合和可视化一体化解 ...