s lock

底层区别两者都是重入锁,前者是底层,reeentrantlock通过cas算法等进行实现

Synchronized分析

s可以加在可以加在方法上、或者代码段上。普通方法----锁的对象,静态方法----锁的是类、代码块锁的是括号里的s在jvm实现原理就是进出monitor来实现,monitorexit和monitorexit来实现。s存储在class对象头中,用三个字宽(1-4字节)存储,非数组就是2个字宽。存储对象的hashcode、粉黛年龄和锁的标志,

偏向锁: 01 线程id 分代年纪 epoch 

轻量级:00指向栈中锁记录的指针 0(是否是偏向锁)

重量级:10指向重量级的互斥量 的指针 0(是否是偏向锁)

gc   :   11 

偏向锁:当锁不存在竞争关系的时候,会默认开偏向锁,进行加锁时,假如markword为空,cas加锁,以后每次进入检测即可。其他线程来竞争时,全局安全点、会将头指向线程暂停,然后查看是否存活,如果活着就升级,否则头设为空轻量级:线程同步之前,会在线程栈中创建空间复制markword,官称displaced markword。然后线程使用cas尝试将对象中指向栈中的displaced markword,如果成功了得到锁,失败了,自旋竞争,如果自悬竞争失败,则锁膨胀升级。

重量级:常说的,来了j就阻塞自旋锁:短时间内可能锁会释放,自己在原地不停申请,然后超时会阻塞

Reentranlock

r直接是在内部实现两个sync,分别是公平与非公平,可以创建时声明。那么这两个sync是实现了AQSAQS:同步队列用来存储;获取失败则会进入队列中,自旋,其他很多都是cas公平非公平区别在于去竞争锁看看是否有前驱结点, 

读写锁

读写锁reentrantreadandwritelock:利用一个整形变量,前16读操作,后16写操作分别两个锁读状态只记录所有次数,各自线程次数自己记录写锁降级:必须是已经拿到写锁,然后再再拿到拿到读锁,然后是写锁。、放申请锁的线程,当开始竞争时,查看申请状态state-cas;查看是否为自己已经得到锁,进行重入

你可能感兴趣的:(s lock)