概念:规定了对共享变量的写操作对其它线程的读操作可见。
常见情况总结:
-
线程对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)的写,其他线程该变量的读是可见的