java并发编程学习笔记--锁

synchronization  同步锁方法

sync原理:sync锁住的是对象、不是代码

java对象在JVM中分成:对象头、对象的实例数据、对齐字节,锁体现在对象头中

//可以用open  jdk jol包查看对象信息 ClassLayout.parseInstance(“对象名”).toPrintable();

打印的结果见下图,对象头占12byte(64位操作系统),对象头中包含mark word 和 klass pointer

同步状态存储在mark word中,详细存储方式见下图(hostspot源码)

java并发编程学习笔记--锁

mark word中包含对象的hash值、age、biased_lock(偏向锁)、lock(对象锁状态)

1、hash:只有计算过hashcode值的对象才有hashcode,前56个bit存储,但是56个bit中后31个是实际存储位置,前边25个是填充值,内存存储是采用小端存储。

java并发编程学习笔记--锁

2、age:对象的age(GC用)占4位,这也就说明GC在从新生代转为老年代是为什么to-from16次后做迁移,因为4位最多可以表示16个状态

3、biased_lock:占1位

4、lock:占2位

无锁状态:001

偏向锁:101

轻量锁:62位线程指针+00

重量锁:62位线程指针+01

GC状态:62位线程指针+11

1、没有锁关键字无锁

2、单线程加关键字采用偏向锁(JVM默认开启延迟4秒,用来兼顾jvm自身进程sync需求,如果关掉默认延迟,初始化对象默认为偏向锁,但偏向线程id为空)

3、多个进程交替执行采用轻量锁

4、多个进程同时执行,产生竞争,会升级为互斥锁(重量锁)

java1.6之前是调用linux mutex方法实现互斥,1.6之后锁不在利用操作系统实现锁,减少线程用户态到核心态的切换阻塞、提升性能

 

java锁有那些类型:公平锁、非公平锁、自选锁、偏向锁、轻量锁、重量锁

面试问:sync实现原理、怎么理解锁、分析是什么锁?