一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情。
1.锁的信息放在哪里
根据前文jvm的知识 Object o = new Object() 锁的信息放在了对象的markword上面 有两个bit来存放锁的标志位
2.为什么要有锁升级
首先明确早起jdk1.2效率非常低。那时候syn就是重量级锁,申请锁必须要经过操作系统老大kernel进行系统调用,入队进行排序操作,操作完之后再返回给用户态。
3.锁升级的过程
对象从创建出来之后进内存从无锁状态->偏向锁(如果开启了)->轻量级锁->重量级锁。对于锁升级的流程继续往下,轻量级锁之后就会编程重量级锁。首先我们先理解什么叫做轻量级锁,从一个线程抢占资源(偏向锁)到多线程抢占资源升级为轻量级锁,线程如果没那么多的话,其实这里就可以理解为CAS,也就是我们说的Compare and Swap,比较并交换值。在并发编程中最简单的一个例子就是并发包下面的原子操作类AtomicInteger。在进行类似++操作的时候,底层其实就是CAS锁
4.为什么有偏向锁
其实这本质上归根于一个概率问题,统计表示,在我们日常用的syn锁过程中70%-80%的情况下,一般都只有一个线程去拿锁,例如我们常使用的System.out.println、StringBuffer,虽然底层加了syn锁,但是基本没有多线程竞争的情况。那么这种情况下,没有必要升级到轻量级锁级别了。偏向的意义在于:第一个线程拿到锁,将自己的线程信息标记在锁上,下次进来就不需要在拿去拿锁验证了。如果超过1个线程去抢锁,那么偏向锁就会撤销,升级为轻量级锁,其实我认为严格意义上来讲偏向锁并不算一把真正的锁,因为只有一个线程去访问共享资源的时候才会有偏向锁这个情况。
5.总结
在以往的认识中,只要用到synchronized就以为它已经成为了重量级锁。在jdk1.2之前确实如此,后来发现太重了,消耗了太多操作系统资源,所以对synchronized进行了优化。以后可以直接用,至于锁的力度如何,JVM底层已经做好了我们直接用就行。