什么是happens-before

happens-before用来保证两个操作直接的可见性。
这里的两个操作,即可以在一个线程,也可以在多个线程中。

具体定义:

1.如果一个操作happens-before另一个操作,那么第一个操作的执行结果,将对第二个操作可见。(保证可见性)
而且第一个操作的执行顺序排在第二个操作之前。(JMM对程序做出的逻辑保障,并不是代码指令真正的执行保证)
2.即使两个操作之间存在happens-before关系,并不意味着Java平台的实现必须要按照happens-before关系指定的顺序执行。

因此,
第一条是JMM对于程序员做出的一个逻辑保障。
第二条是JMM对编译器,处理器重排序的约束原则。只要不改变程序的执行结果(不管是单线程还是多线程)。编译器,处理器怎么优化都可以。

happens-before规则

一个线程中的每个操作happens-before该线程中任意后续操作。

监视器锁规则

对一个锁的解锁操作happens-before随后对这个锁的加锁。

volatile变量规则

对volatile修饰的字段进行的写操作happens-before任意后续对这个volatile修饰的字段进行的读操作。
如下面的代码,run方法的第一行一定happens-beforerun方法的第二行。在多线程环境下也是如此。在每次对num赋值的时候,会强制刷新进主内存。让其它缓存持有num失效。

private volatile int num=0;
//新线程
void run(){num=9;int a=num;
}

传递性

其实这个非常好理解,没什么好说的,第一行happens-before第二行,第二行happens-before第三行,那么第一行happens-before第三行

int a=1;
int b=6;
int c=a=b;

start规则

如果在线程A里面去执行线程B的start,那么在线程A里面的B.start()操作happens-before线程B中的任意操作。
这个是非常好理解的。写过多线程一看就明白。

join规则

如果在线程A里面去执行线程B.join(),那么在线程B里面的任意操作 happens-before线程A中执行了线程B.join()之后的操作。
没什么好说的,就是把join的特性说了一遍。

Java多线程之 happens-before相关推荐

  1. Java 多线程的基本方式

    Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

  2. Java多线程读取本地照片为二进制流,并根据系统核数动态确定线程数

    Java多线程读取图片内容并返回 1. ExecutorService线程池 2. 效率截图 3. 源码 1. ExecutorService线程池 ExecutorService线程池,并可根据系统 ...

  3. Java多线程,Thread,Runnable,Callable Task,Future<Task>,CompletionService

    一.Java多线程的方法 1. 继承 Thread 2. 实现 Runnable 3. 实现 Callable 可以有返回值 package com.test;import java.util.Arr ...

  4. 【收藏】Java多线程/并发编程大合集

    (一).[Java并发编程]并发编程大合集-兰亭风雨    [Java并发编程]实现多线程的两种方法    [Java并发编程]线程的中断    [Java并发编程]正确挂起.恢复.终止线程    [ ...

  5. 40个Java多线程问题总结

    (转) 这篇文章作者写的真是不错 40个问题汇总 1.多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡.所谓"知其然知其所 ...

  6. Java多线程编程实战:模拟大量数据同步

    背景 最近对于 Java 多线程做了一段时间的学习,笔者一直认为,学习东西就是要应用到实际的业务需求中的.否则要么无法深入理解,要么硬生生地套用技术只是达到炫技的效果. 不过笔者仍旧认为自己对于多线程 ...

  7. Java多线程学习处理高并发问题

    在程序的应用程序中,用户或请求的数量达到一定数量,并且无法避免并发请求.由于对接口的每次调用都必须在返回时终止,因此,如果接口的业务相对复杂,则可能会有多个用户.调用接口时,该用户将冻结. 以下内容将 ...

  8. Java多线程常见面试题及答案汇总1000道(春招+秋招+社招)

    Java多线程面试题以及答案整理[最新版]Java多线程高级面试题大全(2021版),发现网上很多Java多线程面试题都没有答案,所以花了很长时间搜集,本套Java多线程面试题大全,汇总了大量经典的J ...

  9. java多线程编程01---------基本概念

    一. java多线程编程基本概念--------基本概念 java多线程可以说是java基础中相对较难的部分,尤其是对于小白,次一系列文章的将会对多线程编程及其原理进行介绍,希望对正在多线程中碰壁的小 ...

  10. Java多线程的同步机制(synchronized)

    一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在 java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个 ...

最新文章

  1. matlab 正四面体,填隙工具箱,caulking box,音标,读音,翻译,英文例句,英语词典
  2. 在Ubuntu18.04上安装ros2的环境,ros2的常用命令:播放包、录制包等
  3. arduino串口绘图_一起打造一款光驱迷你绘图仪
  4. 多个maven project项目之间进行引用
  5. 多边形对角线条数(C语言)
  6. 系统启动数据库服务器,linux系统如何启动数据库服务器
  7. 【转】C#与C++的发展历程第一 - 由C#3.0起
  8. tf.div()除法运算
  9. sqlmap第一次打靶成功
  10. 区块链报告会心得体会3000_区块链讲座观后感6
  11. pos收银系统 php,POS收银系统
  12. 大学计算机专业学习哪些课程?
  13. android 崩溃相关
  14. 如何删除Facebook评论
  15. IOS开发 汉字转拼音 把用户名按照姓名首字母进行排序
  16. dream on!!
  17. 树莓派研究笔记(7)-- lakka 《仙剑奇侠传》的完美移植
  18. Blender Cycles 辉光(Bloom)效果
  19. 如何白手起家挣到一百万?
  20. 鬼畜视频创作神器——EDIUS Pro 非线性视频编辑软件(9.0)汉化特别版

热门文章

  1. Unity3D 判断鼠标向左还是向右滑动
  2. 开门最快的服务器,魔兽怀旧服最有牌面的服务器,开门进度惊人,国服的牌面...
  3. 软件工程-个人作业-提问回顾与个人总结
  4. RDMA入门——RDMA学习笔记(一)
  5. A*算法详解(讲的一级棒 )
  6. linux 显卡驱动程序 接口,Linux显卡驱动程序Nvidia 384.59发布,增加对GeForce GT 1030 GPU支持...
  7. DoTween常用动画效果
  8. List Stream 的常规用法
  9. 多目标跟踪之匈牙利算法
  10. 2021软考数据库工程师复习笔记记录