Java多线程之轻量级同步机制:volative 关键字

152 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

轻量级同步机制: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 比较

  1. volatile 关键字是线程同步的轻量级实现,所以volatile性能肯定比 synchronized 要好;

volatile 只能修饰变量,而 synchronized 可以修饰方法,代码块.

随着 JDK 新版本的发布,synchronized 的执行效率也有较大的提升,在开发中使用 sychronized 的比率还是很大的.

  1. 多线程访问 volatile 变量不会发生阻塞,而 synchronized 可能会阻塞

  2. volatile 能保证数据的可见性,但是不能保证原子性; 而synchronized 可以保证原子性,也可以保证可见性

  3. 关键字 volatile 解决的是变量在多个线程之间的可见性;

synchronized 关键字解决多个线程之间访问公共资源的同步性.