浅谈锁机制
什么是锁
在并发环境下,多个线程对同一资源进行争夺,为了管理这个秩序,就诞生了锁机制。
先浅谈一下线程的生命周期
首先就是初始阶段,线程new出来了,开始进入runnable状态,在runnable状态,所需要使用的资源被其他资源占用并上了锁,这个时候就进入到了休眠的阻塞状态(block),然后休眠状态下,调用了wait方法,或者在线程执行过程中,调用了B.join(),就会进入休眠的等待状态。在休眠状态,会等待这个可用资源的出现,出现了就会进入这个runnable状态,交给操作系统去等待cpu的分配执行。执行完或者异常就进入timenited,执行结束。
再浅谈一下java的对象锁
在Java对象中,每一个对象都有着一把对象锁。对象分为,对象头(mark word + class point)+对象体(存放方法,属性等)+对象尾(补充位,无其他作用)。对象头的mark word 标记着对象的各种锁,具体如图。
谈谈锁的升级
新建一个对象时,再禁用偏向锁或者在偏向锁的延迟时间内,对象锁标记为无锁001。超过偏向加载时间就会标记为偏向锁101,这个时候该对象就会对调用他的这个A线程进行标记,在mark word中存放该A线程id以及有效时间戳,该A线程在下次调用资源时可用直接调用。如果另外的B线程来调用这个资源,该对象就会根据之前存的A线程id去寻找这个A线程,如果这个A线程不在了,那么就将之前的A线程id改存为当前的这个B线程id;如果之前的A线程还存活,那么就说明本资源存在竞争,同时,锁升级为轻量级锁00,这个时候如果A线程过来也要使用该资源了,就会自旋(cpu空转)等待B线程的使用,B使用结束了,A就可以调用。如果超过这个自旋时间,那锁会再次升级为重量级锁10。
简单写写,以上请阅读时带有怀疑的态度,加上自己的思考去理解锁机制