volatile 与 synchronized 比较
1.volatile 关键字是线程同步的轻量级实现,所以volatile性能肯定 比 synchronized 要好; volatile 只能修饰变量,而 synchronized 可以修饰方法,代码块. 随着 JDK 新版本的发布,synchronized 的执行效率也 有较大的提升,在开发中使用 sychronized 的比率还是很大的.
2.多线程访问volatile变量不会发生阻塞,而 synchronized 可能会阻塞
3.volatile能保证数据的可见性,但是不能保证原子性;而synchronized可以保证原子性,也可以保证可见性
4.关键字volatile解决的是变量在多个线程之间的可见性;
public class Test02 {
public static void main(String[] args) throws InterruptedException {
PrintString printString =new PrintString();
new Thread(new Runnable() {
@Override
public void run() {
printString.printStringMethod();
}
}).start();
Thread.sleep(1000);
System.out.println("在main线程中修改打印标志");
printString.setContinuePrint(false);
}
static class PrintString{
//使用volatile关键字修饰PrintString对象的打印标志
//volatile的作用可以强制线程从公共内存中读取变量的值
private volatile boolean continuePrint = true;
public PrintString setContinuePrint(boolean continuePrint){
this.continuePrint = continuePrint;
return this;
}
public void printStringMethod(){
System.out.println(Thread.currentThread().getName()+"开始...");
while (continuePrint){
}
System.out.println(Thread.currentThread().getName()+"结束...");
}
}
}