`
城的灯
  • 浏览: 152196 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java happen before(JSR133)

    博客分类:
  • 2013
阅读更多
相信对Java并发编程有所了解的人一定知道JMM,Java内存模型主要就是用来控制线程之间通信的,JMM决定了一个线程对共享变量的修改何时对别的线程可见。JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。
从jdk5开始JSR133提出了新的内存模式即happen before的概念,通过找个概念阐述了多个操作的可见性。此处所说的是多个操作,而非多个线程,因为编译器重排序规则和处理器重排序,并非按照我们写的代码的顺序执行。那什么是happen before呢?最简单的就是一个操作的结果对另一个可见,可以简单粗暴的理解为什么在什么之间执行(实际上其实不是这样的)。

JSR133的目标:
Preserving existing safety guarantees, like type-safety, and strengthening others. For example, variable values may not be created "out of thin air": each value for a variable observed by some thread must be a value that can reasonably be placed there by some thread.
The semantics of correctly synchronized programs should be as simple and intuitive as possible.
The semantics of incompletely or incorrectly synchronized programs should be defined so that potential security hazards are minimized.
Programmers should be able to reason confidently about how multithreaded programs interact with memory.
It should be possible to design correct, high performance JVM implementations across a wide range of popular hardware architectures.
A new guarantee of initialization safety should be provided. If an object is properly constructed (which means that references to it do not escape during construction), then all threads which see a reference to that object will also see the values for its final fields that were set in the constructor, without the need for synchronization.
There should be minimal impact on existing code.


happen before规范:
Each action in a thread happens before every action in that thread that comes later in the program's order.
An unlock on a monitor happens before every subsequent lock on that same monitor.
A write to a volatile field happens before every subsequent read of that same volatile.
A call to start() on a thread happens before any actions in the started thread.
All actions in a thread happen before any other thread successfully returns from a join() on that thread.

happen before翻译过来就是:
程序顺序规则:一个线程中的每个操作,happens- before 于该线程中的任意后续操作。
监视器锁规则:对一个监视器锁的解锁,happens- before 于随后对这个监视器锁的加锁。
volatile变量规则:对一个volatile域的写,happens- before 于任意后续对这个volatile域的读。
传递性:如果A happens- before B,且B happens- before C,那么A happens- before C。
Thread.start()的调用会happens-before于启动线程里面的动作。
Thread中的所有动作都happens-before于其他线程从Thread.join中成功返回。
1
2
分享到:
评论
1 楼 城的灯 2013-09-22  
这个就很好的解释了软件包 java.util.concurrent.atomic支持在单个变量上解除锁的线程安全编程。

原子访问和更新的内存效果一般遵循以下可变规则,正如 The Java Language Specification, Third Edition (17.4 Memory Model) 中的声明:

get 具有读取 volatile 变量的内存效果。
set 具有写入(分配)volatile 变量的内存效果。
除了允许使用后续(但不是以前的)内存操作,其自身不施加带有普通的非 volatile 写入的重新排序约束,lazySet 具有写入(分配)volatile 变量的内存效果。在其他使用上下文中,当为 null 时(为了垃圾回收),lazySet 可以应用不会再次访问的引用。
weakCompareAndSet 以原子方式读取和有条件地写入变量但不 创建任何 happen-before 排序,因此不提供与除 weakCompareAndSet 目标外任何变量以前或后续读取或写入操作有关的任何保证。
compareAndSet 和所有其他的读取和更新操作(如 getAndIncrement)都有读取和写入 volatile 变量的内存效果。

相关推荐

    JSR133中文版,JSR133中文版

    Happen-Before内存模型是JSR-133中定义的一种内存模型,它描述了操作之间的顺序关系。这种内存模型可以用来确保在多线程环境下,操作的执行顺序是正确的。 JSR-133是Java语言中非常重要的规范,它定义了Java语言的...

    第29讲Java内存模型中的happen-before1

    7. **传递性**:如果 A `happen-before` B,B `happen-before` C,那么 A `happen-before` C。 理解 `happen-before` 规则对于编写高效的并发代码至关重要。例如,使用 `volatile` 变量可以确保多线程环境中的数据...

    ERP Make it Happen

    ERP Make it Happen ERP Make it Happen ERP Make it Happen ERP Make it Happen

    volatile与happens-before的关系与内存一致性错误

    在Java并发编程中,理解和掌握volatile关键字以及happens-before原则对于解决内存一致性错误至关重要。内存一致性错误通常出现在多线程环境下,当不同线程访问共享变量时,由于缓存和处理器优化,可能导致数据不一致...

    深入浅出了解happens-before原则

    在 Java 内存模型(JMM)中,happens-before 原则是一个核心概念,它规定了多线程环境下的可见性原则。该原则的核心思想是:两个操作之间的 happens-before 关系,并不意味着前一个操作必须在后一个操作之前执行。...

    java并发编程常识

    HappenBefore法则定义了特定操作之间的顺序关系,确保多线程环境下操作的有序性,比如程序次序法则指出如果一段代码在逻辑上是先执行的,那么它在实际执行时也必须是先执行的;监视器法则指出对监视器的解锁必须在...

    2021 java面试题.pdf

    内存屏障和happen-before原则是多线程编程中的概念,确保内存操作的顺序和可见性。GC Roots是垃圾收集的起点,用于确定对象是否可达。不同的垃圾收集器如CMS、G1和ZGC各有其优化策略,ZGC中的染色指针用于跟踪对象的...

    Java 高并发三:Java内存模型和线程安全详解

    例如,线程的启动操作Happen-Before该线程的任何读写操作,`synchronized`块的结束Happen-Before同一锁的下次获取,以及对`volatile`变量的写操作Happen-Before其他线程对这个变量的读操作。 线程安全是指在多线程...

    JAVA断言技术详解

    JAVA断言技术详解,1、What will happen when you attempt to compile and run the following code? (Assume that the code is compiled and run with assertions enabled) 1. public class AssertTest 2. { 3. ...

    Java选择题40道全英文带答案

    Java选择题40道全英文带答案 本资源摘要信息中包含了40道Java选择题,涵盖了Java语言的多个方面,包括基本语法、变量、运算符、控制结构、函数、数组、字符串等。下面是对每道题目的详细解释: 1. Read the ...

    Making_Things_Happen

    In the updated edition of this critically acclaimed and bestselling book Microsoft project veteran Scott Berkun offers a collection of essays on field tested philosophies and strategies for defining ...

    Java Service Wrapper64位破解

    去CSDN下载所谓破解出现以下错误:wrapper | Licensed to (null) for (null) wrapper | wrapper |... (6) jvm 1 | WrapperJNI Error: This can happen if the Wrapper binary is not... 自己改了之后可以部署了,分享包

    java并发编程实践的.pptx

    - **Happen-Before原则**:这是Java内存模型中的一个重要概念,它定义了不同线程之间操作的顺序关系。具体包括以下几种情况: - **程序次序法则**:如果一个操作在另一个操作之前发生,那么第一个操作的结果对第二...

    并发编程基础知识,java内存模型及多线程、volatile

    Happen-Before规则是一组用于保证线程之间执行顺序的规则,主要包括: - 程序顺序原则:在一个线程内部保证语义的串行性。 - volatile规则:volatile变量的写操作先于任何读操作。 - 锁规则:解锁操作必然发生在...

    Java中synchronized正确使用方法解析

    例如,在使用 synchronized void addOne() 方法时,happen before 原则可以保证在多线程环境下,共享资源的访问安全性。 七、get() 方法的安全性 get() 方法是获取共享资源的值的方法。在多线程环境下,get() 方法...

    Java多线程中提到的原子性和可见性、有序性1

    此外,Java内存模型中有一个“先行发生”原则(Happen-Before),它定义了操作之间的顺序关系,确保操作B之前能看到操作A的影响。例如,线程A中的i = 1;在被线程B的j = i;看到之前,必须已经完成,这保证了线程B能够...

    [Making.Things.Happen(2008)].Scott.Berkun.文字版

    ### 项目管理核心知识点解析——《Making Things Happen》概览 #### 一、书籍简介与作者背景 《Making Things Happen》是一本由Scott Berkun撰写的项目管理指南,首次出版于2008年。该书是微软项目管理入门教材之...

Global site tag (gtag.js) - Google Analytics