论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
Java面试之多线程&并发篇(4)
Java面试之多线程&并发篇(4)
美丽的神话
金牌会员
|
2024-11-15 08:58:20
|
显示全部楼层
|
阅读模式
楼主
主题
996
|
帖子
996
|
积分
2988
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
前言
本来想着给本身放松一下,刷刷博客,忽然被几道面试题难倒!说一说本身对于 synchronized 关键字的相识?说说本身是怎么利用 synchronized 关键字?什么是线程安全?Vector是一个线程安全类吗?volatile关键字的作用?好像有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘
*** 12万字的java面试题整理 ***
*** java核心面试知识整理 ***
*** Java高频面试讲解(知识涵盖齐全) ***
说一说本身对于 synchronized 关键字的相识?
synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以包管被它修饰的方法或者代码块在任意时刻只能有一个线程执行。
另外,在 Java 早期版本中,synchronized属于重量级锁,服从低下,由于监督器锁(monitor)是依赖于底层的操纵体系的Mutex Lock 来实现的,Java 的线程是映射到操纵体系的原生线程之上的。假如要挂起或者叫醒一个线程,都需要操纵体系帮忙完成,而操纵体系实现线程之间的切换时需要从用户态转换到内核态,这个状态之间的转换需要相对比较长的时间,时间成本相对较高,这也是为什么早期的synchronized 服从低的原因。
光荣的是在 Java 6 之后 Java 官方对从 JVM 层面临synchronized 较大优化,所以现在的 synchronized 锁服从也优化得很不错了。JDK1.6对锁的实现引入了大量的优化,如自旋锁、顺应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操纵的开销。
说说本身是怎么利用 synchronized 关键字?
修饰实例方法: 作用于当前对象实例加锁,进入同步代码前要得到当前对象实例的锁
修饰静态方法:也就是给当前类加锁,会作用于类的所有对象实例,由于静态成员不属于任何一个实例对象,是类
成员( static 表明这是该类的一个静态资源,不管new了多少个对象,只有一份)。
所以假如一个线程A调用一个实例对象的非静态 synchronized 方法,而线程B需要调用这个实例对象所属类的静态 synchronized 方法,是答应的,不会发生互斥现象,由于访问静态 synchronized 方法占用的
锁是当前类的锁,而访问非静态 synchronized 方法占用的锁是当前实例对象锁。
修饰代码块: 指定加锁对象,对给定对象加锁,进入同步代码库前要得到给定对象的锁。
总结: synchronized 关键字加到 static 静态方法和 synchronized(class)代码块上都是是给 Class 类上锁。synchronized关键字加到实例方法上是给对象实例上锁。只管不要利用 synchronized(String a) 由于JVM中,字符串常量池具有缓存功能!
什么是线程安全?Vector是一个线程安全类吗?
假如你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。假如每次运行结果和单线程运行的结果是一样的,而且其他的变量 的值也和预期的是一样的,就是线程安全的。
一个线程安全的计数器类的同一个实例对象在被多个线程利用的情况下也不会出现盘算失误。很显然你可以将聚集类分成两组,线程安全和非线程安全的。
Vector 是用同步方法来实现线程安全的, 而和它相似的ArrayList不是线程安全的。
volatile关键字的作用?
一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:
包管了不同线程对这个变量进行操纵时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
禁止进行指令重排序。
volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被壅闭住。
volatile仅能利用在变量级别;synchronized则可以利用在变量、方法、和类级别的。
volatile仅能实现变量的修改可见性,并不能包管原子性;synchronized则可以包管变量的修改可见性和原子性。
volatile不会造成线程的壅闭;synchronized可能会造成线程的壅闭。
volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
美丽的神话
金牌会员
这个人很懒什么都没写!
楼主热帖
Python 实现贪心算法
Spark快速上手(3)Spark核心编程-RDD转 ...
Python自动操作 GUI 神器——PyAutoGUI ...
什么是超融合数据中心网络? ...
java中Files.mismatch方法具有什么功能 ...
Kubernetes——Pod对象的声明周期(Pod ...
哈工大软件构造Lab3(2022)
GIS前沿技术
彻底理解 volatile 关键字及应用场景, ...
C# net core 微信公众号导出历史文章 ...
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
鸿蒙
快速回复
返回顶部
返回列表