volatile和 synchronized 的区别:
- volatile 提升变量对线程的可见性 ,而非原子性
- synchronized同步方法和同步代码块是原子性的
- volatile是轻量级,只能修饰变量。synchronized是重量级,作用于一段代码或者方法
可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果。另一个线程马上就能看到。
1.可见性验证
运行以下代码,
public class Demo11 {
static boolean flag=true;
public static void main(String[] args) throws InterruptedException {
Thread t1=new Thread(()->{
while (flag){
}
});
t1.start();
Thread.sleep(5000);
flag=false;
}
}
线程一直在死循环中运行,count.flag=false;的改变并没有影响到线程。 而把flag的声明改为volatile boolean flag ; ,则在count.flag=false; 之后停止了while循环。这里体现的是volatile 提升变量对线程的可见性
public class Demo11 {
static volatile boolean flag=true;
public static void main(String[] args) throws InterruptedException {
Thread t1=new Thread(()->{
while (flag){
}
});
t1.start();
Thread.sleep(5000);
flag=false;
}
}
2.不保证原子性验证
以下代码的运行结果基本上是小于100的。所以volatile 没有保证原子性
public class Demo11 {
static volatile int i=0;
public static void main(String[] args) {
for (int j = 0; j < 100; j++) {
new Thread(()->{
++i;
}).start();
}
System.out.println(i);
}
}
|