码迷,mamicode.com
首页 > 其他好文 > 详细

公平锁与非公平锁源码对比

时间:2017-11-26 16:51:31      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:exclusive   直接   its   释放   关于   div   UI   int   clu   

语义:

1.公平锁:每个线程在获取锁的时候,会先检查该锁维护的等待队列,如果该队列是空或者当前线程是第一个,则占有锁,否则按照FIFO的原则,进入等待队列,等待获取锁;

2.非公平锁:当前线程在获取锁的时候,不管该锁的维护队列种是否有其它等待线程,直接CAS,如果cas失败,则再执行公平锁的那一套;

 

源码比较如下:
公平锁:

 

        final void lock() {
            acquire(1);
        }

 

 

非公平锁:

        final void lock() {
            if (compareAndSetState(0, 1))  //先尝试获取锁
                setExclusiveOwnerThread(Thread.currentThread());
            else
                acquire(1);//获取锁失败,再采用公平锁的方式;
        }

 

 

 

 

关于锁的释放,公平锁与非公平锁是一样的:

    public final boolean release(int arg) {
        if (tryRelease(arg)) {
            Node h = head;
            if (h != null && h.waitStatus != 0)
                unparkSuccessor(h);
            return true;
        }
        return false;
    }

 

 

关于公平锁与非公平锁的更底层的一些东西,比如volatile的使用,因为涉及到native方法,暂时没有深究。

 

公平锁与非公平锁源码对比

标签:exclusive   直接   its   释放   关于   div   UI   int   clu   

原文地址:http://www.cnblogs.com/zqsky/p/7899195.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!