synchronization 同步锁方法
sync原理:sync锁住的是对象、不是代码
java对象在JVM中分成:对象头、对象的实例数据、对齐字节,锁体现在对象头中
//可以用open jdk jol包查看对象信息 ClassLayout.parseInstance(“对象名”).toPrintable();
打印的结果见下图,对象头占12byte(64位操作系统),对象头中包含mark word 和 klass pointer
同步状态存储在mark word中,详细存储方式见下图(hostspot源码)
mark word中包含对象的hash值、age、biased_lock(偏向锁)、lock(对象锁状态)
1、hash:只有计算过hashcode值的对象才有hashcode,前56个bit存储,但是56个bit中后31个是实际存储位置,前边25个是填充值,内存存储是采用小端存储。
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实现原理、怎么理解锁、分析是什么锁?