java可见性之 Happens-before
定义
Happens-before 关系是用来描述和可见性相关问题的,我们可以简单理解,就是按顺序执行,一个个来。
举例:小情侣一起做饭,小美女在洗米,小帅哥在弄电饭锅,必须等米洗完后,才能开始煮饭。
在java中,happens-before是一种关系运算符,用于定义两个事件之间的时间顺序,happens-before只在 Java 的内存模型中起作用。保证了可见性。
如果第一个操作happens-before第二个操作(也可以描述为第一个操作和第二个操作之间的happens-before关系),那么我们说第一个操作对于第二个操作是一定可见的,当执行第二个操作时,保证看到第一个操作的结果。
Java中的happens-before关系可以通过使用synchronized关键字来实现。synchronized关键字可以将多个方法或代码块设置为同步的,即只有一个线程可以访问它们,而其他线程则需要等待。
下面是一个示例代码,展示了如何使用synchronized关键字实现happens-before关系:
public class MyConcurrency { private static final Object lock = new Object(); public void method1() { synchronized (lock) { System.out.println("Method1 is executing"); } } public void method2() { synchronized (lock) { System.out.println("Method2 is executing"); } } public void method3() { synchronized (lock) { System.out.println("Method3 is executing"); } }
}
在上面的示例代码中,我们创建了一个名为lock的对象作为同步锁,然后在每个方法中使用synchronized关键字将其包围。这意味着只有一个线程可以访问method1()、method2()和method3()方法,而其他线程则需要等待。
Happens-before 关系的规则
(1)单线程规则:在单线程中,按照程序代码的先后顺序,先执行的操作在后执行的操作之前
(2)锁操作规则(Lock和synchronized接口等):如果操作A是解锁,操作B是锁同一个锁,那么hb(A,B)。
(3) volatile 变量规则:对volatile 变量的写操作happens-before 之后是对该变量的读操作。
举一个不具备 happens-before 关系的例子
比如多个线程同时对一个数进行操作,如下
public class Visibility {int x = 0;public void write() {x = 1;}public void read() {int y = x;}
}
java可见性之 Happens-before相关推荐
- java 可见性_Java并发编程-volatile可见性详解
前言 要学习好Java的多线程,就一定得对volatile关键字的作用机制了熟于胸.最近博主看了大量关于volatile的相关博客,对其有了一点初步的理解和认识,下面通过自己的话叙述整理一遍. 有什么 ...
- java 可见_java 可见性简单总结
Java 可见性 内存模型 主存 所有线程都可以访问 本地内存 每个线程私有的内存 - java 的所有变量都存储在主内存中 - 每个线程有自己独的工作内存,保存了该线程使用到的变量副本,是对主内存中 ...
- 从Java到Kotlin(三)
本篇文章主要对比Java跟Kotlin中的类和接口的写法. 目录 一.类的声明 二.构造函数 三.函数的参数 四.创建类的实例 五.数据类 六.枚举类 七.属性 八.内部类 九.可见性修饰符 十.继承 ...
- Java字符串真的不可变吗?
本文翻译自:Is a Java string really immutable? We all know that String is immutable in Java, but check the ...
- 如何正确的创建和销毁Java对象
作者 | RonTech 来源 | https://blog.csdn.net/zyhlwzy/article/details/78937421 一.介绍 Java由Sun Microsystems发 ...
- Kotlin学习笔记 第二章 类与对象 第五节 可见性 第六节 扩展
参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...
- vivo一面翻车,整理完这份Java面经分类汇总,我突然悟了
前言 这篇记录一下今年在vivo面试的准备所有面经,我给大家简单的做了一个分类汇总,本来是用来为vivo二面提前做准备的,谁知道一面都没过,现在人还在人才库里. 我还是很想去vivo的,希望下次能有机 ...
- 开发三年,靠这份Java面试宝典,拿到字节offer
前言 前几天由于工作的原因一直没怎么看私信,昨天在整理私信的时候看到了一个粉丝给我疯狂私信想要我帮忙整理一份大厂面试题,说自己工作也有几年了想跳槽冲刺一下,但是不知道该怎么做好前期准备.我看到这个粉丝 ...
- 关于Kotlin修饰符internal和Java的默认修饰符的区别
前言 在讲述问题前我们先了解下Java和Kotlin可见性修饰符. Java可见性修饰符public.protected.default(默认修饰符).private可见性如下: 修饰符\作用域 当前 ...
最新文章
- windows mysql 自动备份的几种方法
- [转] Java中的static关键字解析
- 使用xrandr和cvt命令添加自定义的分辨率模式
- puppet运行慢的一个小例子
- Hyper-V passes Microsoft’s checkmarks exam: isn’t that always the case?
- java 静态类实例_Java中多个类的静态实例?
- 大陆和香港手机号正则校验
- 微信小程序即时通讯(融云sdk)
- Python 调用高德 API 实现地址转为经纬度
- 在微型计算机系统中 视频适配器为,一级计算机基础知识整理解说.xls
- 最小二乘法及应用实例
- Spring Boot 五种热部署方式
- 韶关python培训班_《韶》字意思读音、组词解释及笔画数 - 新华字典 - 911查询
- 当 Spring Cloud 遇上 SOFAStack | Meetup#2 回顾
- 《沈剑架构师训练营》第3章 - 快速性能优化
- 《看板实战》读书笔记 XMIND版本
- 如何构建自我的认知系统
- 阿里云nginx安装
- 软件测试中的批量交易测试
- python decorator wrapper_python装饰器(decorator)
热门文章
- SharedPreferences
- 计算机专业课程学习顺序
- 短视频有哪些内容形式
- SQL Server如何设置账号密码
- python交互界面实例_什么是“面向对象”程序设计-以Python为例
- android 数独小游戏
- ZOJ 3450 Doraemon's Railgun (DP·分组背包)
- 编程已正式列入高考!孩子的未来, 不仅仅与语数英有关!
- 美团民宿-“你的民宿,你做主”活动增长主题策划方案1.0
- SqlDeveloper一直显示正在连接而sqlplus可以连接到数据库