jsr133
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的更多相关文章
- Java内存模型-jsr133规范介绍
原文地址:http://www.cnblogs.com/aigongsi/archive/2012/04/26/2470296.html; 近期在看<深入理解Java虚拟机:JVM高级特性与最佳 ...
- 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 ...
- Java内存模型-jsr133规范介绍(转)
最近在看<深入理解Java虚拟机:JVM高级特性与最佳实践>讲到了线程相关的细节知识,里面讲述了关于java内存模型,也就是jsr 133定义的规范. 系统的看了jsr 133规范的前面几 ...
- Java内存模型(JSR133)问与答
What is a memory model, anyway? In multiprocessor systems, processors generally have one or more lay ...
- JSR133规范学习
最近在看多线程相关的东西,通过阅读JSR133的faq来加深自己对多线程的理解,里面大部分的内容比较简单(越到后面越难),但是有的部分比较难以理解还没有完全弄懂,所以这里只记录了一下比较简单的阅读笔记 ...
- Java-内存模型(JSR-133)
Java 内存模型(Java Memory Model,JMM)看上去和 Java 内存结构(JVM 运行时内存结构)差不多,但这两者并不是一回事.JMM 并不像 JVM 内存结构一样是真实存在的,它 ...
- JSR-133内存模型手册
1.介绍 JVM支持多种线程的执行,Threads代表的是线程类,位于java.lang.Thread包下,唯一的方式就是为用户在这个类下的对象创建线程,每一个线程关联着一个对象,一个线程将在star ...
- JSR133提案-修复Java内存模型
目录 1. 什么是内存模型? 2. JSR 133是关于什么的? 3. 再谈指令重排序 4.同步都做了什么? 5. final字段在旧的内存模型中为什么可以改变? 6."初始化安全" ...
- [并发编程] -- 内存模型(针对JSR-133内存模型)篇
并发编程模型 1.两个关键问题 1)线程之间如何通信 共享内存程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信 消息传递程之间没有公共状态,线程之间必须通过发送消息来显式进行通信 2) ...
随机推荐
- javaScript学习(入门)
不落俗套的来讲讲javascript的特点: 1.所有主流浏览器都是支持javascript的. 2.绝大部分网页都使用javascript. 3.javascript可以实现网页呈现各种动态效果. ...
- ios上架报错90080,90087,90209,90125 解决办法
ERROR ITMS-90087: "Unsupported Architectures. The executable for yht.temp_caseinsensitive_renam ...
- Bootstrap 3 模态框播放视频
Bootstrap 3 模态框播放视频 I'm trying to use the Modal feature from Bootstrap 3 to show my Youtube video. I ...
- C语言文法 LL(1)文法
程序->外部声明 | 程序 外部声明 程序->外部声明A' A'->外部声明A'|ε 外部声明->修饰符 变量名 形参 修饰符->void | int | char | ...
- Best Coder Round#25 1003 树的非递归访问
虽然官方解释是这题目里的树看作无向无环图,从答案来看还是在“以1作为根节点”这一前提下进行的,这棵树搭建好以后,从叶节点开始访问,一直推到根节点即可——很像动态规划的“自底向上”. 但这棵树的搭建堪忧 ...
- luajava学习一
luajava环境的搭建就不写了,网上百度,google下就ok啦. 我是在android平台下运行的项目,好了先看代码 TextView tv=(TextView)findViewById(R.id ...
- UIKit框架之UITouch
1.继承链:NSObject 2.获取触发点的位置 (1)- (CGPoint)locationInView:(UIView *)view :返回指定视图的触发点的位置 (2)- (CGPoint)p ...
- spring结合quartz的定时的2种方式
1. Spring 的org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean类,使用此方法使开发人员对Quar ...
- windows核心编程---第九章 同步设备IO与异步设备IO之同步IO
同步设备IO 所谓同步IO是指线程在发起IO请求后会被挂起,IO完成后继续执行. 异步IO是指:线程发起IO请求后并不会挂起而是继续执行.IO完毕后会得到设备的通知.而IO完成端口就是实现这种通知的很 ...
- keyFile 巩固练习
系统 : Windows xp 程序 : noodles-crackme2 程序下载地址 :http://pan.baidu.com/s/1mhJ4Ems 要求 : 编写KeyFile 使用工具 : ...