说一说自己对于 synchronized 关键字的理解 ?

synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者 代码块在任意时刻只能有一个线程执行。

另外,在 Java 早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(monitor)是依赖于底层的操 作系统的 Mutex Lock 来实现的,Java 的线程是映射到操作系统的原生线程之上的。

如果要挂起或者唤醒一个线程, 都需要操作系统帮忙完成,而操作系统实现线程之间的切换时需要从用户态转换到内核态,这个状态之间的转换需要 相对比较长的时间,时间成本相对较高,这也是为什么早期的 synchronized 效率低的原因。

庆幸的是在 Java 6 之后 Java 官方对从 JVM 层面对synchronized 较大优化,所以现在的 synchronized 锁效率也优化得很不错了。JDK1.6对 锁的实现引入了大量的优化,如自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的 开销。

对象的访问定位的两种方式

java对象在访问的时候,我们需要通过java虚拟机栈的reference类型的数据去操作具体的对象。

由于reference类型在java虚拟机规范中只规定了一个对象的引用,并没有定义这个这个引用应该通过那种方式去定位、访问java堆中的具体对象实例,所以一般的访问方式也是取决与java虚拟机的类型。目前主流的访问方式有通过句柄和直接指针两种方式。

1.句柄访问

使用句柄访问方式,java堆将会划分出来一部分内存去来作为句柄池,reference中存储的就是对象的句柄地址。而句柄中则包含对象实例数据的地址和对象类型数据(如对象的类型,实现的接口、方法、父类、field等)的具体地址信息。下边我以一个例子来简单的说明一下:

Object obj = new Object();

Object obj表示一个本地引用,存储在java栈的本地便变量表中,表示一个reference类型的数据。

Java大厂出的精品面试题,免费领取

Java面试题:synchronized和对象的访问定位的两种方式相关推荐

  1. Java常见面试题:对象的访问定位的两种方式

    对象的访问定位的两种方式 java对象在访问的时候,我们需要通过java虚拟机栈的reference类型的数据去操作具体的对象. 由于reference类型在java虚拟机规范中只规定了一个对象的引用 ...

  2. 关于虚拟机中对象访问定位的两种方式的一些思考

    前言 本文是在周志明老师经典作品<深入理解Java虚拟机>第二章第三节的基础上对句柄和直接指针两种对象访问方式的深入思考,有不准确的地方希望读者不吝赐教. JVM中访问对象的两种方式 1. ...

  3. Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除(CRUD)

    Java版数据结构之单向链表 CRUD Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除; 留了一个疑问; 我的代码仓库:https://github.com/zhuangbinan ...

  4. java木马_Java校验上传图片文件是否含有木马的两种方式

    这两天开发一个app遇到了上传文件的安全问题,在这里记录下来,弥补自己只有鱼的记忆的缺陷,也希望有人能够提供更好的思路去解决文件上传的安全问题. 下面这个类是文件上传的公共方法,ToolUtils判断 ...

  5. java中byte数组与int类型的转换(两种方式)

    java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形 ...

  6. java中map类型_Java中Map类型遍历的两种方式对比

    Java中Map类型是存储键值对数据的类型,在编程过程经常使用,进行遍历操作对于每个Java程序员都不会模式,下面总结两种常用的遍历方式(一种keySet,一种entrySet),通过对比让你明白使用 ...

  7. java get和post请求参数设置,Get和Post两种方式向指定地址提交表单

    做Java做了很多年,却总是把一些东西遗忘,过后再着急的找寻.最近,需要通过Java代码模拟一个表单提交,却怎么也想不起来如何封装数据了. 本篇主要描述Java网络参数传递,主要分为get和post两 ...

  8. java new class 直接调用_java中创建对象的的两种方式具体解释,一个是new一个是调用Class类的newinstance方法?...

    展开全部 1.new 使用java的关键字new来创建对象实例.构造函数链中的所有构造函数都32313133353236313431303231363533e78988e69d833133333739 ...

  9. java 金钱计算_Java中涉及到金钱计算方法的两种方式

    一.不直接使用float和double计算金钱的原因 java中涉及到浮点计算,就会有误差, float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.Big ...

最新文章

  1. 2022-2028年中国油气勘探工程产业研究及前瞻分析报告
  2. 使用Node.js快速搭建WebSocket server
  3. 使用Fresco加载图片
  4. 字节跳动实习生提出实例分割新方法:性能超过何恺明Mask R-CNN
  5. 玩转树莓派——安装系统
  6. 为什么lp的最优解是一个概率_什么时候应该用概率图模型、消息传递替代传统组合优化求解器?未来工作?(持续更新)...
  7. Matlab中plot函数及legend函数详解
  8. oracle的redo与undio
  9. Delphi Access Violation错误的分析
  10. 「大学生学编程系列」第六篇:如何学习C语言?
  11. request 和 session 获取方法
  12. 【项目经理之修炼(9)】《初级篇》谦虚也是可以修炼的
  13. pg数据库中两个字段相除
  14. Drupal独到的编程思想
  15. 【opencv-python不规则多边形 ROI提取】
  16. 高德js-v1.4.13多图层 天地图 谷歌 高德mark点显示
  17. 小红书账号分析丨小红书kol速成干货分享
  18. (转载)TRS的WCM6漏洞权限绕过以及绕过密码的登陆方式
  19. mysql oder by 注入_Order by排序注入方法小总结
  20. 复习JavaScript时的笔记

热门文章

  1. [转载] Python中的enumerate函数介绍
  2. [转载] python基础:面向对象-封装
  3. MyBatis数据库连接的基本使用-补充Mapper映射器
  4. POJ 3621:Sightseeing Cows(最优比率环)
  5. SQL,C#查询Excel数据
  6. Android系统中震动功能的测试
  7. [ZT]CCNA课堂精简笔记 2
  8. (七)图像处理中常用算子Laplacian\Sobel\Roberts\Prewitt\Kirsch
  9. 【RobotStudio学习笔记】(八)速度设置
  10. docker中容器与宿主机之间的网络关系