【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;
    }
}
相关文章
|
5天前
|
前端开发 Java 编译器
【前端学java】java基础练习缺少项目?看这篇文章就够了!(完结)
【8月更文挑战第11天】java基础练习缺少项目?看这篇文章就够了!(完结)
14 0
|
1月前
|
存储 安全 Java
Java面试题:深入探索Java内存模型,Java内存模型中的主内存与工作内存的概念,Java内存模型中的happens-before关系,volatile关键字在Java内存模型中的作用
Java面试题:深入探索Java内存模型,Java内存模型中的主内存与工作内存的概念,Java内存模型中的happens-before关系,volatile关键字在Java内存模型中的作用
20 1
|
6天前
|
缓存 前端开发 Java
【前端学java】java基础巩固复习巩固语法练习-工具类的封装(14)
【8月更文挑战第10天】java基础巩固,工具类的封装
11 1
【前端学java】java基础巩固复习巩固语法练习-工具类的封装(14)
|
5天前
|
前端开发 Java 编译器
【前端学java】java基础练习缺少项目?看这篇文章就够了!(17)
【8月更文挑战第11天】java基础练习缺少项目?看这篇文章就够了!
12 0
【前端学java】java基础练习缺少项目?看这篇文章就够了!(17)
|
29天前
|
安全 Java 开发者
探索Java内存模型:可见性、有序性和并发
在Java的并发编程领域中,内存模型扮演了至关重要的角色。本文旨在深入探讨Java内存模型的核心概念,包括可见性、有序性和它们对并发实践的影响。我们将通过具体示例和底层原理分析,揭示这些概念如何协同工作以确保跨线程操作的正确性,并指导开发者编写高效且线程安全的代码。
|
1月前
|
缓存 安全 Java
Java面试题:解释volatile关键字的作用,以及它如何保证内存的可见性
Java面试题:解释volatile关键字的作用,以及它如何保证内存的可见性
41 4
|
1月前
|
设计模式 安全 Java
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
54 1
|
1月前
|
存储 缓存 安全
Java面试题:介绍一下jvm中的内存模型?说明volatile关键字的作用,以及它如何保证可见性和有序性。
Java面试题:介绍一下jvm中的内存模型?说明volatile关键字的作用,以及它如何保证可见性和有序性。
21 0
|
1月前
|
Java 开发者
Java面试题:解释Java内存模型中的内存可见性,解释Java中的线程池(ThreadPool)的工作原理,解释Java中的CountDownLatch和CyclicBarrier的区别
Java面试题:解释Java内存模型中的内存可见性,解释Java中的线程池(ThreadPool)的工作原理,解释Java中的CountDownLatch和CyclicBarrier的区别
18 0
|
1月前
|
Java 数据库连接
Java面试题:Java内存模型中的happens-before关系,Java中的ThreadLocal是如何工作的?Java中的CountDownLatch和CyclicBarrier的区别?
Java面试题:Java内存模型中的happens-before关系,Java中的ThreadLocal是如何工作的?Java中的CountDownLatch和CyclicBarrier的区别?
17 0