博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
转:【Java并发编程】之十五:并发编程中实现内存可见的两种方法比较:加锁和volatile变量...
阅读量:5153 次
发布时间:2019-06-13

本文共 780 字,大约阅读时间需要 2 分钟。

转载请注明出处:

 

     在这篇博文中,讲述了通过同步实现内存可见性的方法,在这篇博文中,讲述了通过volatile变量实现内存可见性的方法,这里比较下二者的区别。

 

    1、volatile变量是一种稍弱的同步机制在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比synchronized关键字更轻量级的同步机制。

    2、从内存可见性的角度看,写入volatile变量相当于退出同步代码块,而读取volatile变量相当于进入同步代码块。

    3、在代码中如果过度依赖volatile变量来控制状态的可见性,通常会比使用锁的代码更脆弱,也更难以理解。仅当volatile变量能简化代码的实现以及对同步策略的验证时,才应该使用它。一般来说,用同步机制会更安全些。

    4、加锁机制(即同步机制)既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性,原因是声明为volatile的简单变量如果当前值与该变量以前的值相关,那么volatile关键字不起作用,也就是说如下的表达式都不是原子操作:“count++”、“count = count+1”。

 

     当且仅当满足以下所有条件时,才应该使用volatile变量:

     1、对变量的写入操作不依赖变量的当前值,或者你能确保只有单个线程更新变量的值。

     2、该变量没有包含在具有其他变量的不变式中。

总结:在需要同步的时候,第一选择应该是synchronized关键字,这是最安全的方式,尝试其他任何方式都是有风险的。尤其在、jdK1.5之后,对synchronized同步机制做了很多优化,如:自适应的自旋锁、锁粗化、锁消除、轻量级锁等,使得它的性能明显有了很大的提升。

转载于:https://www.cnblogs.com/xuyatao/p/6919464.html

你可能感兴趣的文章
jquery动态移除/增加onclick属性详解
查看>>
css important
查看>>
KindEditor图片上传到七牛云
查看>>
JavaScript---Promise
查看>>
暖暖的感动
查看>>
Java中的日期和时间
查看>>
Django基于admin的stark组件创建(一)
查看>>
批处理/DOS命令删除文件夹下某类型的文件
查看>>
模板 - 数学 - 矩阵快速幂
查看>>
优秀的持久层框架Mybatis,连接数据库快人一步
查看>>
PAT L2-016 愿天下有情人都是失散多年的兄妹
查看>>
抛弃IIS,利用FastCGI让Asp.net与Nginx在一起
查看>>
C. Tanya and Toys_模拟
查看>>
使用SwingWork反而阻塞SwingUI
查看>>
Windchill中如何扩展字段长度?
查看>>
pytorch中的forward前向传播机制
查看>>
课后作业-阅读任务-阅读提问-4
查看>>
Delphi 深入浅出VCL(2)-TObject所有对象的根
查看>>
配置IIS虚拟目录遇到的5个问题
查看>>
2-03顺序表的操作
查看>>