java中实现可见性的三个关键字

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;
}

猜你喜欢

转载自blog.csdn.net/pengzhisen123/article/details/80270062