一、volatile关键字
适用:当多个线程共享一个变量时,如果有一个线程修改此变量,其他线程读取此变量值。
特性:
- 内存可见性。
- 阻止重排序。
注意:
- 只能确保变量可见性,并不能确保原子性。
- volatile不具备“互斥性”。
3.
应用示例
- volatile保证了数据可见性。性能比synchronize效率高。
/** * 关键字:volatile * @author xiaobin * @date 2018/3/3 */
public class TestVolatile {
public static void main(String[] args) {
ThreadDemo td = new ThreadDemo();
new Thread(td).start();
while (true) {
System.out.println(1);
if (td.isFlag()) {
System.out.println("--------");
break;
}
}
}
}
class ThreadDemo implements Runnable {
private volatile boolean flag = false;
@Override
public void run() {
try {
Thread.sleep(200);
} catch (Exception e) {
}
flag = true ;
System.out.println("flag=" + isFlag());
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
}
二、内存可见性
在java内存模型中,分为主内存和各个线程私有的工作内存。主内存数据被各个线程共享。线程对所有数据的操作都在工作内存中进行,之后在刷新到主内存。
上面示例,线程操作共享数据如下所示:
感谢尚硅谷提供的学习视频。