一、32位JVM
二、64位JVM
三、synchronized的锁升级过程中,markWord内容
锁状态:
当一个对象刚开始new出来时,该对象是无锁状态。此时偏向锁位为0,锁标志位01
如果有线程上锁:
指的就是把markword的线程ID改为自己线程ID的过程
如果有线程竞争:
撤销偏向锁,升级轻量级锁
线程在自己的线程栈生成LockRecord,用CAS操作将markword设置为指向自己这个线程的LockRecord的指针,设置成功者得到锁
如果竞争加剧
竞争加剧:有线程超过10次自旋, -XX:PreBlockSpin,或者自旋线程数超过CPU核树的一半,1.6之后,加入自适应自旋adapative self spinning,JVM自己控制;
升级重量级锁: 向操作系统升级资源,等待操作系统的调度,然后再映射会用户空间;
四、hashCode为什么可以用31位显示?
如果对象没有重写hashCode,那么默认调用os::random产生hashCode,可以通过
System.identityHashCode获取;
os::random产生hashCode规则:next_rand = (16807 seed)mode(2*31-1)
所以使用31位存储,另外一旦产生了hashCode,JVM会将其记录在markWord中;