1:介绍

  java虚拟机支持多线程运行。线程代表的就是Thread class。对用户来说创建线程的唯一办法就是创建一个Thread对象;每一个线程都和一个Thread对象关联。Thread对象调用start()方法就启动了相应的线程。

  线程的表现,尤其是当不能正常同步的时候,会变得混乱和违法直觉。这个规范说明(指:jsr133)描述了java语言里多线程编写的语义定义;它包含了这样的规则:即定义共享内存的读线程能够读到被共享内存的写线程写入的哪些数据。尽管这个规范类似于不同硬件架构的内存模型,但这是一个java内存模型的语义定义(semantics )。

  这些语义并不是描述一个多线程程序是如何执行的。而是描述了多线程程序允许展现的行为。(the behaviors that multithreaded programs are allowed to exhibit.)

(Any execution strategy that generates only allowed behaviors is an acceptable execution strategy. )任何执行策略只要产生的是这个规范允许的行为那么它就是可以接受的执行策略。

1.1 Locks

  多线程之间的沟通有很多种机制。最基础的机制就是同步(synchronization),使用monitors来实现的机制。每个对象关联一个监听器(monitor),一个线程可以锁定或者解锁它。同一时间只有一个线程可以持有一个监视器的锁。任何其他试图锁定已经被锁定的监视器的线程都会被阻塞直到他们持有这个监视器的锁。

  一个线程t可以锁定一个特定的监听器很多次;每一个解锁操作对应一次锁定操作,还原对象状态。

  同步声明(同步块)计算出一个对象的引用;然后尝试执行一个对该对象监视器的锁定操作并且直到锁定完成之前不会继续执行。锁定操作执行后,同步声明中的操作才会被执行。如果同步块的执行完成,不管是正常结束还是异常终端,同一个监视器锁的解锁操作都会自动执行。

  一个同步方法在调用时会自动执行一个锁定操作;在锁定操作完成之前同步方法的内容不会被执行。如果这个方法是一个实例方法,它锁定的是它被调用实例关联的监视器(monitor)(也就是:方法体执行过程中被称为this的这个对象)。如果是静态方法,它锁定的就是方法声明所在的类的类对象对应的监视器。同样的,一旦方法体执行结束,不管是正常的还是异常终止,解锁操作都会在同一个监听器上自动执行。

  这份声明文档(指本文)既不提供也不需要检测死锁的条件。那些多线程持有(直接或间接)多个对象的锁的程序应该使用常用的避免死锁的方法,如果有必要的话,就创建更级别的锁原语。

  其他机制,例如读取和写入Volatile以及在java.util.concurrent 包中的类,提供了正确同步的可选方法。

1.2 Notation in Examples

  Java内存模型并不是根本上基于java语言的面相对象特性的。为了例子的简洁、简易,我们只展示代码片段而忽略类和方法的定义,或者明确的非关联性。大多数例子是由两个或多个包括访问本地变量,共享全局变量或者一个对象的字段实例的状态的线程组成。我们一般使用类似r1或者r2这样的变量名来表明一个方法或者一个线程的本地变量。这些变量是不能够被其他线程访问的。

3:Informal Semantics

  当代码被重排序的时候,一个程序必须被正确的同步来避免多种类型的违反直觉的行为发生。使用正确的同步不能保证程序里上述的行为是正确的。但是,使用它允许一个程序员以一种简单的途径来推理出一个程序的可能行为;一个正确同步的程序的行为是极少依赖可能的重排序的。没有正确的同步,非常奇怪的、令人迷惑的和匪夷所思的行为就可能会出现。

  有两个关键的办法来理解一个程序是否正确同步了:

  1:Conflicting Accesses (访问冲突)

    两个访问(读取或者写入)同一个共享字段或者数组元素,如果其中至少有一个访问时写入那么就被称为冲突Conficting。

  2:Happens-Before Relationship

    两个行为如果是happens-before关系,可以排序。如果一个行为happens-before另一个行为

jsr133的更多相关文章

  1. Java内存模型-jsr133规范介绍

    原文地址:http://www.cnblogs.com/aigongsi/archive/2012/04/26/2470296.html; 近期在看<深入理解Java虚拟机:JVM高级特性与最佳 ...

  2. The JSR-133 Cookbook for Compiler Writers(an unofficial guide to implementing the new JMM)

    The JSR-133 Cookbook for Compiler Writers by Doug Lea, with help from members of the JMM mailing lis ...

  3. Java内存模型-jsr133规范介绍(转)

    最近在看<深入理解Java虚拟机:JVM高级特性与最佳实践>讲到了线程相关的细节知识,里面讲述了关于java内存模型,也就是jsr 133定义的规范. 系统的看了jsr 133规范的前面几 ...

  4. Java内存模型(JSR133)问与答

    What is a memory model, anyway? In multiprocessor systems, processors generally have one or more lay ...

  5. JSR133规范学习

    最近在看多线程相关的东西,通过阅读JSR133的faq来加深自己对多线程的理解,里面大部分的内容比较简单(越到后面越难),但是有的部分比较难以理解还没有完全弄懂,所以这里只记录了一下比较简单的阅读笔记 ...

  6. Java-内存模型(JSR-133)

    Java 内存模型(Java Memory Model,JMM)看上去和 Java 内存结构(JVM 运行时内存结构)差不多,但这两者并不是一回事.JMM 并不像 JVM 内存结构一样是真实存在的,它 ...

  7. JSR-133内存模型手册

    1.介绍 JVM支持多种线程的执行,Threads代表的是线程类,位于java.lang.Thread包下,唯一的方式就是为用户在这个类下的对象创建线程,每一个线程关联着一个对象,一个线程将在star ...

  8. JSR133提案-修复Java内存模型

    目录 1. 什么是内存模型? 2. JSR 133是关于什么的? 3. 再谈指令重排序 4.同步都做了什么? 5. final字段在旧的内存模型中为什么可以改变? 6."初始化安全" ...

  9. [并发编程] -- 内存模型(针对JSR-133内存模型)篇

    并发编程模型 1.两个关键问题 1)线程之间如何通信 共享内存程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信 消息传递程之间没有公共状态,线程之间必须通过发送消息来显式进行通信 2) ...

随机推荐

  1. jpa遇到的 org.hibernate.PersistentObjectException: detached entity passed to persist异常

    jpa遇到的 org.hibernate.PersistentObjectException: detached entity passed to persist异常 发生这个原因是因为我们已经在实体 ...

  2. Eclipse 搭建 Maven Web项目

    第一步:安装JDK: 第二步:安装Eclipse: 第三步:安装tomcat7: 第四步:安装maven插件: 4.1 下载maven:http://maven.apache.org/download ...

  3. GnuRadio Hacking②:使用SDR嗅探北欧芯片无线键盘鼠标数据包

    0×00 前言 上半年的时候安全公司Bastille Networks(巴士底狱)安全研究员发现大多数无线鼠标和接收器之间的通信信号是不加密的,黑客可对一两百米范围内存在漏洞的无线键鼠进行嗅探甚至劫持 ...

  4. PAT 1072. Gas Station (30)

    A gas station has to be built at such a location that the minimum distance between the station and a ...

  5. OpenCV阶段总结扩充。

    Mat类型简单介绍 /* cv::Mat类是用于保存图像以及其他矩阵的数据结构.默认情况下,其尺寸为0,我们也可以设置其初始尺寸,比如定义一个Mat类的对象,就要写cv::Mat pic(320,64 ...

  6. OD20

    查壳   发现没有壳          那就载入OD 在命令中在API函数下下个断点 然后程序跑起来 ,   点CHECK  断下来了 在动态链接库断下来了      我们alt+F9   回到用户界 ...

  7. Unity 3D 基础知识方法

    A. 组件中默认的方法有如下:            Awake,Start,Update,OnGUI,OnDisable,OnEnable,OnDestory,LateUpdate,FixedUpd ...

  8. zenefits oa - random(5) to generate a random(7)

    If given a function that generates a random number from 1 to 5, how do you use this function to gene ...

  9. Win10/UWP新特性—Drag&Drop 拖出元素到其他App

    在以前的文章中,写过微软新特性Drag&Drop,当时可能由于处于Win10预览版,使用的VS也是预览版,只实现了从桌面拖拽文件到UWP App中,没能实现从UWP拖拽元素到Desktop A ...

  10. (转)asp.net中获得客户端的IP地址

    因为要在项目中取到客户端IP,在网上搜了下相关资料,其中有一篇文章总结的比较详细,这里就把一些我用的上总结一下 方便以后查阅. 通常我们都通过下面的代码获得IP:   string ip =Syste ...