1、volatile
通过内存屏障和禁止指令重排序来保证可见性的。
(a)、对volatile进行读操作,会在读操作之前增加一个load屏障指令
(b)、对volatile进行写操作,会在写操作之后增加一个store屏障指令
内存屏障:处理器的一组指令,用于实现对内存操作的顺序限制(指令重排时不能把后面的指令重排列到内存屏障之前的位置)
2、synchronized
同步块的可见性是由:对一个变量执行unlock操作之前,必须把此变量同步回主内存中(执行store、write操作)
3、final
其可见性是指:被final修饰的字段在构造器中一旦初始化完成,并且构造器没有把“this”的引用传递出去(this引用逃逸是一件很危险的事情,其它线程有可能通过这个引用访问到“初始化了一半”的对象),那在其他线程中就能看见final字段的值。如下程序所示,变量i和j都具备可见性,他们无须同步就能被其他线程正确访问。
public static fianl int i;
public final int j;
static{
int i=0;
//do something
}
{
//也可以选择在构造函数中初始化
j=0;
//do something;
}