章节介绍

  本章节主要学习 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。

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

锁的有点和缺点

转载于:https://www.cnblogs.com/zhengzeze/p/9788462.html

【java并发编程艺术学习】(四)第二章 java并发机制的底层实现原理 学习记录(二) synchronized...相关推荐

  1. java语言定义一个具备栈功能的类_Java学习笔记 第二章 Java语言基础

    第二章 JAVA语言基础 一.关键字 1.关键字的定义和特点 定义:被Java语言赋予了特殊含义的单词 特点:关键字中所有的字母都为小写 2.用于定义数据类型的关键字 c;ass  interface ...

  2. java并发机制的底层实现原理(volatile,synchronized,原子操作)

    目录 volatile的应用 volatile的定义与实现原理 volatile的使用优化 synchronized的实现原理与应用 Java对象头 锁的升级与对比 偏向锁 轻量级锁 锁的优缺点对比 ...

  3. Java并发编程艺术学习笔记(五)

    Java并发编程艺术学习笔记(五) Java并发容器和框架 Java为开发者也提供了许多开发容器和框架,可以从每节的原理分析来学习其中精妙的并发程序. 一.ConcurrentHashMap的实现原理 ...

  4. 《Java并发编程的艺术》:第2章 Java并发机制的底层实现原理

    前言 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节 码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和 CPU的指令. ...

  5. 《Java并发编程的艺术》一一第2章Java并发机制的底层实现原理

    第2章Java并发机制的底层实现原理 2.1 volatile的应用 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行, ...

  6. Java 并发编程艺术 读书笔记

    第 1 章 并发编程的挑战 1.1.3 如何减少上下文切换 减少上下文切换的方法有无锁并发编程.CAS 算法.使用最少线程和使用协程. 无锁并发编程.多线程竞争锁时,会引起上下文切换,所以多线程处理数 ...

  7. 进击 !!第二章 JAVA编程基础

    第二章 JAVA编程基础 目标: 掌握java的基本语法,常量,变量,流程控制语句,方法以及数组 运用java运算符的使用 了解java代码的基本格式 2.1java 的基本语法 1. 代码的基本格式 ...

  8. JAVA并发编程艺术读书笔记(1,2章节)

    第一章 并发编程的挑战 为什么要使用并发编程? 主要是为了更有效地利用资源.即使是单核的CPU也可以多线程执行程序,多线程实际上是CPU分配时间片给各个线程,因为时间片非常短,所以看起来就像在同事执行 ...

  9. java并发编程艺术——基础篇

    这篇文章目的是为了总结一下这段时间看<java并发编程艺术>学到的东西,尝试用自己的话说出来对java多线程的理解和使用. 一.什么是多线程,为什么要用多线程,多线程带来的挑战 多线程定义 ...

最新文章

  1. ProLiant 服务器安装 Ret Hat Enterprise Linux AS 3 说明 (一)
  2. 如何打开设计思路,避免不断改稿?只需提前做好这一步
  3. groovy使用范型的坑
  4. [Unity3D]Unity3D游戏开发Lua随着游戏的债券(于)
  5. mysql单源多表同步单库单表_MySQL主从复制单表或者多表
  6. 第三章 随机变量的数字特征
  7. python列表keys函数_字典常用函数(clear、get、items、keys、values、pop)
  8. 北理工计算机专业汇编教材,李元章_北京理工大学计算机学院
  9. 计算机外围设备哪两类,计算机原理2010年4月真题(02384)
  10. 装机员Ghost一键备份还原使用方法(硬盘装系统)
  11. java实现pdf转word,如何使用Java将pdf文件转换为word文件
  12. 4.顺序栈和循环队列的基本运算
  13. Linux下安装配置使用python虚拟环境
  14. Re:从0开始的微服务架构:(二)如何快速体验微服务架构?
  15. gdal调用capi处理乱码问题(c#)
  16. Required field ‘serverProtocolVersion‘ is unset! User: root is not allowed to impersonate root
  17. MySQL多表联表查询
  18. 将图片压缩至指定大小Kb(Thumbnailator)
  19. 【业务架构】获得正确业务能力的 12 项必备措施
  20. 氨酰胺酶(glutaminase, GLS) 活性测定试剂盒说明书

热门文章

  1. (转载)查看Oracle字符集及怎样修改字符集
  2. ASP.NET部署与安装_MSI制作图文教程.
  3. 16-margin的用法
  4. Java调用Lua脚本(热载实现)
  5. Ansible-playbook 拾遗
  6. 深入实践Spring Boot1.3 使用Spring Boot
  7. 【hrbust2294】方方正正
  8. 魔兽世界客户端数据研究(四):M2文件头分析
  9. weblogic启动脚本
  10. PostgreSQL连接问题(Net LO problem)