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碰撞运动实现方法详解

