续对它的读之前
线程启动法则:Thread.start一定发生在线程中的动作前
线程终结法则:线程中的任何动作一定发生在线程终结之前(其他线程检测到这个线程已经终止,从Thread.join调用成功返回,Thread.isAlive()返回false)
中断法则:一个线程调用另一个线程的interrupt一定发生在另一线程发现中断之前。
终结法则:一个对象的构造函数结束一定发生在对象的finalizer之前
传递性:A发生在B之前,B发生在C之前,A一定发生在C之前。
使用HB关系,在多线程开发时就可以尽量少的避免使用锁,而是直接利用hb关系和volatile关键字来达到信息传递并且可见的目的。
比如很常见的一个线程处理一些数据并且修改标识位后,另外的线程检测到标识位发生改变,就接手后续的流程。此时如何保证前一个线程对数据做出的更改后一个线程全部可见呢。先来看下面的代码例子
class VolatileExample {
int a = 0;
volatile boolean flag = false;
public void writer() {
a = 1; //1
flag = true; //2
}
public void reader() {
while(flag==false); //3
int i=a; //4
}
}
有两个不同的线程分别执行writer和reader方法,根据Hb规则,有如下的顺序执行图。
这样的顺序,i读取到的a的值就是最新的,也即是1.
参考文献