s lock

作者: 朱汉成 | 来源:发表于2018-07-23 11:47 被阅读0次

    底层区别两者都是重入锁,前者是底层,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

          本文链接:https://www.haomeiwen.com/subject/kjsyeftx.html