【Java基础】java可见性之 Happens-before

简介: 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;
    }
}
相关文章
|
2月前
|
Java Linux
java基础(3)安装好JDK后使用javac.exe编译java文件、java.exe运行编译好的类
本文介绍了如何在安装JDK后使用`javac.exe`编译Java文件,以及使用`java.exe`运行编译好的类文件。涵盖了JDK的安装、环境变量配置、编写Java程序、使用命令行编译和运行程序的步骤,并提供了解决中文乱码的方法。
65 2
|
3月前
|
Java 编译器 C++
【Java基础面试一】、为什么Java代码可以实现一次编写、到处运行?
这篇文章解释了Java能够实现“一次编写,到处运行”的原因,主要归功于Java虚拟机(JVM),它能够在不同平台上将Java源代码编译成的字节码转换成对应平台的机器码,实现跨平台运行。
【Java基础面试一】、为什么Java代码可以实现一次编写、到处运行?
|
3月前
|
Java
【Java基础面试四】、介绍一下Java的数据类型
这篇文章介绍了Java的数据类型,包括8种基本数据类型(整数、浮点、字符、布尔)和3类引用数据类型(数组、类、接口),并提供了基本数据类型所占内存空间和数据范围的详细信息。
|
3月前
|
前端开发 Java 编译器
【前端学java】java基础练习缺少项目?看这篇文章就够了!(完结)
【8月更文挑战第11天】java基础练习缺少项目?看这篇文章就够了!(完结)
40 0
|
15天前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
2月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
420 37
|
1月前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
20 1
|
1月前
|
Oracle Java 关系型数据库
|
2月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
2月前
|
缓存 安全 Java
【Java面试题汇总】Java基础篇——基础、修饰符和关键字(2023版)
Java的特点和优点,、Java 8的新特性、面向对象、基本数据类型和引用类型、自动拆装箱与自动装箱、==与equals()的区别、为什么重写equals()就要重写hashcode()、抽象类和接口的区别、重载和重写的区别、四种引用方式、wt()和sleep()的区别、java方法是值传递还是引用传递?访问修饰符、static、final、this和super、volatile的用法及原理
【Java面试题汇总】Java基础篇——基础、修饰符和关键字(2023版)
下一篇
无影云桌面