volatile关键字的介绍和使用
介绍 关键字 volatile 使用
2023-09-27 14:26:05 时间
关键字volatile的主要作用是使变量在过个线程中可见
1、假设volatile不存在我们将会面对的问题
public class PrintString implements Runnable
{
private boolean isContinuePrint = true;
public boolean isContinuePrint() {
return isContinuePrint;
}
public void setContinuePrint(boolean isContinuePrint) {
this.isContinuePrint = isContinuePrint;
}
public void printStringMethod()
{
try
{
while(isContinuePrint)
{
System.out.println("run printStringMethod threadName = " + Thread.currentThread().getName());
Thread.sleep(1000);
}
}
catch(InterruptedException exception)
{
exception.printStackTrace();
}
}
@Override
public void run() {
printStringMethod();
}
}
public class Test {
/**
* @param args
*/
public static void main(String[] args)
{
try
{
PrintString mPrintString = new PrintString();
Thread mThread = new Thread(mPrintString);
mThread.start();
Thread.sleep(1000);
mPrintString.setContinuePrint(false);//在-server模式下,这个操作修改的是公共堆栈中的值,而线程的私有堆栈并没有修改
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
当JVM 在-server模式下并不会停止PrintString的method,因为在-server的模式下存在一个公共堆栈和线程私有堆栈的概念。我们在调用setConinuePrinter(false)修改的是公共堆栈中的值,并不会影响到线程的私有堆栈。
此时我们需要引入volatile关键字,作用是强制线程去公共堆栈中访问isContinuePrint的值。
使用volatile关键字增加了实例变量在多个线程之间的可见性,但volatile关键字有一个致命的缺陷是不支持原子性
synchronized与volatile关键字之间的比较
- 关键字volatile是线程同步的轻量实现,所以volatile关键字性能比synchronized好。volatile只能修饰变量,synchronized可以修饰方法,代码块
- volatile不会阻塞线程,synchronized会阻塞线程
- volatile能保证数据的可见性,不保证原子性,synchronized可以保证原子性,可以间接保证可见性,它会将公共内存和私有内存的数据做同步处理。
- volatile解决的是变量在多个线程之间的可见性,synchronized解决的是多个线程之间访问资源的同步性
请记住Java的同步机制都是围绕两点:原子性,线程之间的可见性.只有满足了这两点才能称得上是同步的。Java中的synchronized和volatile两个关键字分别执行的是原子性和线程之间的可见性。
volatile 并非原子性
来源:http://blog.csdn.net/a284266978/article/details/50866737
参考:http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html
相关文章
- 【相似度计算】详解文本相似度计算(介绍、公式)
- 对象映射工具AutoMapper介绍
- 2023最新版会声会影更新下载及功能介绍
- 第14天: Web 开发 Flask 介绍
- Map集合、散列表、红黑树介绍
- 数据中心网络带宽性能测试方法介绍
- 阿里云通用算力型u1实例规格介绍(实例特点、适用场景、指标数据)
- python nose测试框架全面介绍十一---用例的发现
- 各种Oracle索引类型介绍
- Android Jetpack组件之WorkManager高级概念介绍与使用(三)
- webpack原理篇(六十三):插件基本结构介绍
- 3.Android网络编程-http介绍
- OpenStack入门篇(五)之KVM性能优化及IO缓存介绍