volatile 关键字

并发编程的三个特性

1、原子性

在一次处理中所有操作要么全执行,要么全不执行。

2、可见性

一个线程对共享变量进行了修改,另外的线程可以立即看到修改后的最新值。

3、有序性

保证程序代码在执行过程中的先后顺序不会被重排序。

volatile关键字可以保证可见性和有序性。实现原理是,被其修饰的变量存在一个lock;前缀。这个相当于一个内存屏障,提供如下保障:

1)确保指令重排序时不会将其后面的代码排到内存屏障之前。

2)确保指令重排序时不会将其前面的代码排到内存屏障之后。

3)确保在执行到内存屏障时,前面的代码指令都已执行完成。

4)强制将线程工作内存中值的修改刷新至主内存中。

5)如果是写操作,会导致其他线程工作内存中的缓存数据失效。

与synchronized比较

volatile关键字用于修饰实例变量或类变量,synchronized关键字用于修饰方法和代码块;

volatile修饰的变量可以为null,synchronized同步的对象不能为空;

volatile不能保证原子性,synchronized可以保证;

volatile关键字不会使线程陷入阻塞,synchronized会使线程进入阻塞状态。

你可能感兴趣的:(Java,多线程,java,后端)