全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java 关键字 volatile 的理解与正确使用

概述

Java语言中关键字 volatile 被称作轻量级的 synchronized,与synchronized相比,volatile编码相对简单且运行的时的开销较少,但能够正确合理的应用好 volatile 并不是那么的容易,因为它比使用锁更容易出错,接下来本文主要介绍 volatile 的使用准则,以及使用过程中需注意的地方。

为何使用volatile?

(1)简易性:在某些需要同步的场景下使用volatile变量要比使用锁更加简单

(2)性能:在某些情况下使用volatile同步机制的性能要优于锁

(3)volatile操作不会像锁一样容易造成阻塞

volatile特性

(1)volatile 变量具有 synchronized 的可见性特性,及如果一个字段被声明为volatile,java线程内存模型确保所有的线程看到这个变量的值是一致的

(2)禁止进行指令重排序

(3)不保证原子性

注:

① 重排序:重排序通常是编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段

② 原子性:不可中断的一个或一系列操作

③ 可见性:锁提供了两种主要特性:互斥和可见性,互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的。

volatile的实现原理

如果对声明了volatile的变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,该Lock指令会使这个变量所在缓存行的数据回写到系统内存,根据缓存一致性协议,每个处理器都会通过嗅探在总线上传输的数据来检查自己缓存的值是否已过期,当处理器发现自己的缓存行对应的地址被修改,就会将当前处理器的缓存行设置成无效状态,在下次访问相同内存地址时,强制执行缓存行填充。

正确使用volatile的场景

volatile 主要用来解决多线程环境中内存不可见问题。对于一写多读,是可以解决变量同步问题,但是如果多写,就无法解决线程安全问题。如:

1、不适合使用volatile的场景(非原子性操作)

(1)反例

​private static volatile int nextSerialNum = 0;
public static long generateSerialNum() {
  return nextSerialNum++;
}

这个方法的目的是要确保每次调用都返回不同的自增值,然而结果并不理想,问题在于增量操作符(++)不是原子操作,实际上它是一个由读取-修改-写入操作序列组成的组合操作,如果第二个线程在第一个线程读取旧值和写回新值期间读取这个域,第二个线程与第一个线程就会读取到同一个值。

(2)正例

其实面对上面的反例场景可以使用JDK1.5 java.util.concurrent.atomic中提供的原子包装类型来保证原子性操作

private static AtomicInteger nextSerialNum = new AtomicInteger(0);
public static long generateSerialNum() {
  return nextSerialNum.getAndIncrement();
}

2、适合使用volatile的场景

在日常工作当中volatile大多被在状态标志的场景当中,如:

要通过一个线程来终止另外一个线程的场景

(1)反例

private static boolean stopThread;
public static void main(String[] args) throws InterruptedException {
  Thread th = new Thread(new Runnable() {
   @Override
   public void run() {
     int i = 0;
     while (!stopThread) {
      i++;
     }
   }
  });
  th.start();
  TimeUnit.SECONDS.sleep(2);
  stopThread = true;
}

运行后发现该程序根本无法终止循环,原因是,java语言规范并不保证一个线程写入的值对另外一个线程是可见的,所以即使主线程main函数修改了共享变量stopThread状态,但是对th线程并不可见,最终导致循环无法终止。

(2)正例

private static volatile boolean stopThread;
public static void main(String[] args) throws InterruptedException {
  Thread th = new Thread(new Runnable() {
   @Override
   public void run() {
     int i = 0;
     while (!stopThread) {
      i++;
     }
   }
  });
  th.start();
  TimeUnit.SECONDS.sleep(2);
  stopThread = true;
}

通过使用关键字volatile修饰共享变量stopThread,根据volatile的可见性原则可以保证主线程main函数修改了共享变量stopThread状态后对线程th来说是立即可见的,所以在两秒内线程th将停止循环。

总结

本文通过对volatile的特性介绍,以及volatile的实现原理,最后结合volatile的特性举例说明它在使用过程中应该注意的使用规则,好了,希望本文对您有所帮助!


# java  # volatile关键字  # Java开发中的volatile你必须要了解一下  # 详解Java面试官最爱问的volatile关键字  # 深入分析java并发编程中volatile的实现原理  # Java中Volatile关键字详解及代码示例  # Java线程之线程同步synchronized和volatile详解  # java中volatile和synchronized的区别与联系  # java中volatile不能保证线程安全(实例讲解)  # java volatile关键字使用方法及注意事项  # Java中volatile关键字实现原理  # Java关键字volatile和synchronized作用和区别  # Java多线程并发编程 Volatile关键字  # java 高并发中volatile的实现原理  # java 中volatile和lock原理分析  # Java中Volatile的作用实例解析  # 见性  # 第一个  # 第二个  # 另外一个  # 反例  # 过程中  # 自己的  # 就会  # 好了  # 互斥  # 两种  # 它是  # 在某些  # 发现该  # 线上  # 只有一个  # 要比  # 可以使用  # 会使  # 写到 


相关文章: 如何规划企业建站流程的关键步骤?  定制建站如何定义?其核心优势是什么?  微课制作网站有哪些,微课网怎么进?  如何在局域网内绑定自建网站域名?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Android自定义控件实现温度旋转按钮效果  ,交易猫的商品怎么发布到网站上去?  网站制作价目表怎么做,珍爱网婚介费用多少?  建站之星安装后如何自定义网站颜色与字体?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  建站主机是否属于云主机类型?  如何选择最佳自助建站系统?快速指南解析优劣  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  建站之星代理商如何保障技术支持与售后服务?  如何选择高效便捷的WAP商城建站系统?  如何零成本快速生成个人自助网站?  制作销售网站教学视频,销售网站有哪些?  青浦网站制作公司有哪些,苹果官网发货地是哪里?  h5网站制作工具有哪些,h5页面制作工具有哪些?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  建站主机功能解析:服务器选择与快速搭建指南  如何选择高效可靠的多用户建站源码资源?  建站之星代理如何获取技术支持?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  如何选择适合PHP云建站的开源框架?  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  网站制作需要会哪些技术,建立一个网站要花费多少?  动图在线制作网站有哪些,滑动动图图集怎么做?  制作网站外包平台,自动化接单网站有哪些?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  Swift中swift中的switch 语句  免费ppt制作网站,有没有值得推荐的免费PPT网站?  实例解析Array和String方法  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  广州美橙建站如何快速搭建多端合一网站?  相册网站制作软件,图片上的网址怎么复制?  广州营销型建站服务商推荐:技术优势与SEO优化解析  定制建站流程解析:需求评估与SEO优化功能开发指南  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  建站之星后台密码遗忘或太弱?如何重置与强化?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  建站之星各版本价格是多少?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  电商网站制作价格怎么算,网上拍卖流程以及规则?  视频网站app制作软件,有什么好的视频聊天网站或者软件? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。