多线程—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)的写,其他线程该变量的读是可见的

猜你喜欢

转载自blog.csdn.net/qq_42251944/article/details/120920351