- volatile关键字作用
可以确保将变量的更新操作通知到其他线程,保证变量在内存中是可见的,每次读取到的值都是最新写入的。类似一种轻量级的锁,与锁的不同之处在于读取volatile修饰的变量时不会加锁,不会造成线程阻塞。
volatile不具有的功能:
a.volatile不能保证变量的“原子性操作”
b. 对于多线程不具有互斥性
例子如下:
public class VolatileTest extends Thread {
public static void main(String[] args) {
ThreadDemo td = new ThreadDemo();
new Thread(td).start();
while (true) {
// synchronized (td) {
if (td.isFlag()) {
System.out.println("------------------");
break;
}
// }
}
}
}
class ThreadDemo implements Runnable {
private boolean flag=false;
// private volatile boolean flag = false;
@Override
public void run() {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
}
flag = true;
System.out.println("flag=" + isFlag());
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
}
程序运行结果:
造成的原因是:多个线程操作共享数据,彼此不可见
2.解决方式
a.使用synchronized同步锁
b.使用volatile关键字修饰变量
3.使用场景
a.对变量的写操作不依赖于当前值
b.该变量没有包含在具有其他变量的不变式中