小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
轻量级同步机制:volative 关键字
volatile 的作用
volatile 关键的作用使变量在多个线程之间可见
package com.wkcto.volatilekw;
/**
* volatile 的作用可以强制线程从公共内存中读取变量的值,而不是从工作内存中读取
* Author: 老崔
*/
public class Test02 {
public static void main(String[] args) {
//创建 PrintString 对象
PrintString printString = new PrintString();
//开启子线程,让子线程执行 printString 对象的 printStringMethod()方法
new Thread(new Runnable() {
@Override
public void run() {
printString.printStringMethod();
}
}).start();
//main 线程睡眠 1000 毫秒
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("在 main 线程中修改打印标志");
printString.setContinuePrint(false);
//程序运行,查看在 main 线程中修改了打印标志之后 ,子线程打印是否可以结束打
印
//程序运行后, 可能会出现死循环情况
//分析原因: main 线程修改了 printString 对象的打印标志后, 子线程读不到
//解决办法: 使用 volatile 关键字修饰 printString 对象的打印标志.
//
volatile 的作用可以强制线程从公共内存中读取变量的值,而不是从工作内
存中读取
}
//定义类打印字符串
static class PrintString{
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() + "结束++++++++++++++");
}
}
}
volatile 与 synchronized 比较
- volatile 关键字是线程同步的轻量级实现,所以volatile性能肯定比 synchronized 要好;
volatile 只能修饰变量,而 synchronized 可以修饰方法,代码块.
随着 JDK 新版本的发布,synchronized 的执行效率也有较大的提升,在开发中使用 sychronized 的比率还是很大的.
-
多线程访问 volatile 变量不会发生阻塞,而 synchronized 可能会阻塞
-
volatile 能保证数据的可见性,但是不能保证原子性; 而synchronized 可以保证原子性,也可以保证可见性
-
关键字 volatile 解决的是变量在多个线程之间的可见性;
synchronized 关键字解决多个线程之间访问公共资源的同步性.