章节介绍

  本章节主要学习 Java SE 1.6 中为了减少获得锁 和 释放锁 时带来的性能消耗 而引入的偏向锁 和 轻量级锁,以及锁的存储结构 和 升级过程。

synchronized实现同步的基础:

  Java中的每个对象都可以作为锁。具体有三种形式:

  (1)对于普通同步方法,锁是当前实例对象;

  (2)对于静态同步方法,锁是当前类的Class对象;

  (3)对于同步方法快,锁是Synchronized括号中配置的对象。

     当一个线程试图访问同步代码块时,它首先必须得到锁,退出或者抛出异常时必须释放锁。

    (synchronized在JVM中的实现原理.....)  

Java对象头

  synchronizede用的锁存在Java对象头里。

  补充(来自网络博文):Java对象保存在内存中时,由三部分组成:对象头、实例数据、对齐填充字节

     a.对象头也是由3部分组成,如下:

     (1)Mark Word ;

       第一部分markword,用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向                           时间戳等,这部分数据的长度在32位和64位的虚拟机(未开启压缩指针)中分别为32bit和64bit,官方称它为“MarkWord”。

       (2)指向类的指针;

        即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例

       (3)数组长度(只有数组对象才有);

       如果对象是一个数组, 那在对象头中还必须有一块数据用于记录数组长度。(需要的话,可以单独找资料学习下这部分的讲解...)

       b.实例数据

        实例数据部分是对象真正存储的有效信息,也是在程序代码中所定义的各种类型的字段内容。无论是从父类继承下来的,还是在子类中定义                            的,都需要记录起来。

        对象的实例数据就是在java代码中能看到的属性和他们的值。

     c.对齐填充字节

        因为JVM要求java的对象占的内存大小应该是8bit的倍数,所以后面有几个字节用于把对象的大小补齐至8bit的倍数,没有特别的功能。   

锁的升级和对比

  在JavaSE 1.6中,锁分为四中状态:无锁状态,偏向锁状态,轻量级锁状态和重量级锁状态。

  这几个状态会随着竞争情况逐渐升级,但是不能往后降级。这种策略的目的是为了提高 获得锁 和 释放锁 的效率。

补充:CAS(Compare And Swap )算法介绍

  CAS操作是乐观锁,每次不加锁,而是假设没有冲突去完成某项操作。如果因为冲突失败就重试,知道成功为止。

  CAS思想:三个参数,一个当前内存值V,旧的预期值A,即将更新值B,当且仅当预期值A 和内存值V相同时,将内存值修改为B并返回true,否则什么也不做,并返回false。

待续.....偏向锁 和 轻量级锁

锁的有点和缺点

最新文章

  1. MyEclipse XFire Web Service
  2. WIN7下搭建CORDOVA环境
  3. Android中include标签的使用
  4. ndk学习14: 进程
  5. [转]How do I use software from a PPA
  6. 返回类型和return语句
  7. JS时间操作
  8. paip.QQ音乐导出歌单总结
  9. 一个简单的基于canvas小游戏
  10. MYSQLI - mysqli
  11. 左右GNU Linux企业加密文件系统 eCryptfs简介
  12. .net webapi项目中支持session
  13. CodeBlocks使用介绍
  14. 自定义CRM系统
  15. windows time-wait 问题处理记录
  16. matplotlib 28原则
  17. [osgearth][原]仿照谷歌,修改oe漫游器中focal(视角切换)功能
  18. SpringMVC(五)-- springmvc的系统学习之拦截器
  19. JAVA中Collection接口和Map接口的主要实现类
  20. 如何快速的打开当前文件夹的dos命令窗口

热门文章

  1. react create app ,nginx服务器配置
  2. valuestack,stackContext,ActionContext.之间的关系以及action的数据在页面中取得的方法
  3. 321list,元组,range**数字是不可迭代的!
  4. autoplay移动端不能自动播放
  5. 大话设计模式--中介者模式 Mediator --C++实现实例
  6. CDH- 测试mr
  7. linux rpm包的编译
  8. httpRequest.CookieContainer= cookie 与 httpRequest.Headers.Add("Cookie", cookie)
  9. Hibernate学习---第十四节:hibernate之session线程安全
  10. Java企业微信开发_00_源码及资源汇总贴