Java关键字volatile和synchronized作用和区别

发布时间 - 2026-01-11 01:51:49    点击率:

volatile是变量修饰符,而synchronized则是作用于一段代码或方法;如下三句get代码:

int i1;
int geti1() {return i1;}

volatile int i2;
int geti2() {return i2;}

int i3;
synchronized int geti3() {return i3;}


geti1() 得到存储在当前线程中i1的数值。多个线程有多个i1变量拷贝,而且这些i1之间可以相互不同。换句话说,另一个线程可能已经改变了它线程内的i1值,而这个值可以和当前线程中的i1值不相同。 在Java内存模型中,有main memory(主内存区域),这里存放了变量目前的“准确值”,每个线程也有自己的memory(例如寄存器)。为了性能,一个线程会在自己的memory中保存要访问的变量的副本。这样就会出现同一个变量在某个瞬间,在一个线程的memory中的值可能与另外一个线程memory的值,或者main memory的值不一致的情况。因此实际上存在一种可能:main memory的值i1值是1,线程1里的i1是2,线程2里的i1值是3,这在线程1和线程2都改变了他们各自的i1值,而且这个改变还没来得及传给main memory 或其他线程时就会发生。

geti2() 得到的是main memory的i2数值。一个变量声明为volatile,就意味着这个变量是随时会被其他线程修改的,因此不能将它cache在线程memory中。换句话说,一个变量经过volatile修饰后在所有线程中必须是同步的,任何线程中改变了它的值,所有其他线程立即获得了相同的值。所以,volatile修饰的变量存取时比一般变量消耗的资源要多一点,因为线程有它自己的变量拷贝更为高效。

geti3()方法被synchronized修饰,用synchronized来修饰一个方法或者一个贷款的时候,能够保证在同一时刻最多只有一个线程执行该段代码。既然volatile关键字已经实现了线程间数据同步,又要synchronized干嘛呢?当两个并发线程访问同一个对象object中的这个synchronized(this)同步贷款时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块才能执行该代码块。然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时候,其他线程对object中所有其他synchronized(this)同步代码块的访问将被阻塞。当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁,结果,其他线程对该对象所有同步代码部分的访问都被暂时阻塞。

总结一下区别:

一,volatile是变量修饰符,而synchronized则作用于一段代码或者方法。

二,volatile只是在线程内存和main memory(主内存)间同步某个变量的值;而synchronized通过锁定和解锁某个监视器同步所有变量的值。显然synchronized要比volatile消耗更多资源。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Java  # volatile  # synchronized  # 深入理解java中的synchronized关键字  # 详解Java中synchronized关键字的死锁和内存占用问题  # Java中synchronized关键字修饰方法同步的用法详解  # java多线程编程之使用Synchronized关键字同步类方法  # JAVA面试题 简谈你对synchronized关键字的理解  # Java中使用synchronized关键字实现简单同步操作示例  # 举例讲解Java中synchronized关键字的用法  # 实例解析Java中的synchronized关键字与线程安全问题  # Java关键字synchronized基本使用详解  # 自己的  # 的是  # 多个  # 改变了  # 作用于  # 获得了  # 就会  # 也有  # 还没  # 最多  # 修饰符  # 则是  # 会在  # 时间内  # 又要  # 将被  # 或其他  # 只有一个  # 要比  # 要多 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何选择可靠的免备案建站服务器?  网站建设整体流程解析,建站其实很容易!  Laravel如何使用Service Container和依赖注入?(代码示例)  昵图网官网入口 昵图网素材平台官方入口  千库网官网入口推荐 千库网设计创意平台入口  javascript中闭包概念与用法深入理解  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  Laravel怎么上传文件_Laravel图片上传及存储配置  html如何与html链接_实现多个HTML页面互相链接【互相】  Laravel Fortify是什么,和Jetstream有什么关系  详解阿里云nginx服务器多站点的配置  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  如何快速查询网站的真实建站时间?  如何有效防御Web建站篡改攻击?  如何在七牛云存储上搭建网站并设置自定义域名?  Windows Hello人脸识别突然无法使用  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  大学网站设计制作软件有哪些,如何将网站制作成自己app?  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  如何为不同团队 ID 动态生成多个独立按钮  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  Laravel定时任务怎么设置_Laravel Crontab调度器配置  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  原生JS获取元素集合的子元素宽度实例  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  Laravel如何使用查询构建器?(Query Builder高级用法)  英语简历制作免费网站推荐,如何将简历翻译成英文?  如何在万网利用已有域名快速建站?  如何快速搭建安全的FTP站点?  三星、SK海力士获美批准:可向中国出口芯片制造设备  详解vue.js组件化开发实践  jQuery中的100个技巧汇总  EditPlus中的正则表达式 实战(2)  如何在万网自助建站平台快速创建网站?  Laravel如何使用Blade组件和插槽?(Component代码示例)  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  如何在云虚拟主机上快速搭建个人网站?  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  常州企业网站制作公司,全国继续教育网怎么登录?  如何快速打造个性化非模板自助建站?  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  JS碰撞运动实现方法详解