多线程—happens-before原则

概念:规定了对共享变量的写操作对其它线程的读操作可见。

常见情况总结:

  • 线程对object解锁之前对变量的写操作,对于接下来对object加锁其它线程对变量的读可见。

    示例代码理解:

    如果t1执行在t2之前,那么t1对变量的写操作,对于t2的读操作是可见的。

static int x;
static Object object = new Object();

new Thread(()->{
 	   synchronized(object){
           x = 10;
       }
},"t1").start();

new Thread(()->{
    synchronized(object){
       System.out.println(x); 
    }
},"t2").start();

线程对volatile变量的写操作,对于接下来其他线程对该变量的读操作是可见的。

理解:同样是t1发生在t2之前,那么t1线程对x变量的写操作,对于t2线程的读操作来说是可见的。

volatile static int x;

new Thread(()->{
     x = 10;
},"t1").start();

new Thread(()->{
      System.out.println(x); 
},"t2").start();

线程start()之前对变量的写,对该线程开始之后对变量的读是可见的。

理解:对变量x的写发生在线程t1启动之前,因此当t1启动之后对变量x的读操作是可见的。

static int x;

x = 10;

new Thread(()->{
      System.out.println(x); 
},"t1").start();

线程结束之前对变量x的写操作,对于其他线程得知t1线程结束后,再对x变量的读操作是可见的。

static int x;

new Thread(()->{
     x = 10;
},"t1").start();
//等待t1结束
t1.join();
//t1结束之后对x变量的读操作是可见的
System.out.println(x); 
  • 线程t1打断t2之前对变量的写,对于其它线程得知t2被打断之后对变量的读是可见的。

  • 对变量默认值(0,false,null)的写,其他线程该变量的读是可见的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何怀逸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值