美文网首页其他零散知识点
Java锁之公平锁和非公平锁

Java锁之公平锁和非公平锁

作者: bearPotMan | 来源:发表于2019-07-22 22:00 被阅读37次

    公平锁

    是指多个线程按照申请锁的顺序来获取锁,遵循的是 先来后到 原则;

    非公平锁

    是指多个线程获取锁的顺序并不是按照申请锁的顺序来,有可能后申请的线程比先申请的线程优先获取锁,在高并发场景下,有可能会造成线程优先级反转或饥饿现象,遵循的是 抢占式 原则。
    什么是饥饿现象呢?就是说有可能后到的线程优先获取锁导致先来的某个线程一直获取不到锁而处于等待状态。

    两者的区别

    • 公平锁:通俗讲就是很公平。在并发环境中,每个线程在获取锁时会先查看此锁维护的等待队列,如果为空,或者当前进程是等待队列的第一个,就占有锁,否则就会加入到等待队列中,以后会按照 FIFO 的规则从队列中取到自己。
    • 非公平锁:相对而言比较粗鲁,一上来就直接尝试占有锁,如果尝试失败,就再采用类似公平锁那种方式。

    并发包中的 ReentrantLock ,在创建它的时候可以通过指定构造函数的 boolean 类型参数来得到公平锁或非公平锁,默认是非公平锁。非公平锁的优点就在于吞吐量比公平锁大。对于 synchronized 而言也是一种非公平锁。

    相关文章

      网友评论

        本文标题:Java锁之公平锁和非公平锁

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