当前位置: 首页 > news >正文

【Java并发编程】:加锁和volatile变量

 

加锁和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/web424/p/6807755.html

相关文章:

  • expdp/impdp 参数说明,中英对照
  • 数据结构第11周笔记
  • for...in
  • 自学前端开发 新版css时钟效果图
  • UVA10129 Play on Words —— 欧拉回路
  • [Apio2012]dispatching 左偏树
  • 杭电1007-----C语言实现
  • 解决云服务器ECS,windows server 2012不能安装SQL Server 2012,不能安装.NET Fromework 3.5...
  • 自适应相关知识点1
  • JavaScript 原型链
  • Mysql数据库批量添加数据
  • Spring MVC解决中文乱码(post get)(转)
  • 网站添加用户风险测评
  • yii2邮件配置教程,报Expected response code 250 but got code 553原因
  • ICON 收集
  • 深入了解以太坊
  • C++入门教程(10):for 语句
  • CSS3 变换
  • docker-consul
  • Linux下的乱码问题
  • PHP的类修饰符与访问修饰符
  • python大佬养成计划----difflib模块
  • React-Native - 收藏集 - 掘金
  • Spark学习笔记之相关记录
  • Terraform入门 - 1. 安装Terraform
  • V4L2视频输入框架概述
  • 笨办法学C 练习34:动态数组
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 初识 beanstalkd
  • 初探 Vue 生命周期和钩子函数
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 我是如何设计 Upload 上传组件的
  • 想使用 MongoDB ,你应该了解这8个方面!
  • PostgreSQL之连接数修改
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • #1014 : Trie树
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (day 12)JavaScript学习笔记(数组3)
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (四) 虚拟摄像头vivi体验
  • (译) 函数式 JS #1:简介
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • .NET Standard 的管理策略
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET 指南:抽象化实现的基类
  • .Net多线程总结
  • .net与java建立WebService再互相调用
  • @Autowired 与@Resource的区别