zoukankan      html  css  js  c++  java
  • 公平锁与非公平锁源码对比

    语义:

    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方法,暂时没有深究。

  • 相关阅读:
    多播委托和匿名方法再加上Lambda表达式
    委托
    从警察抓小偷看委托
    StringBuilder
    C#修饰符详解
    数据结构与算法之队列
    数据结构与算法之栈
    win10重复安装
    网络编程基础
    PrintPreviewControl
  • 原文地址:https://www.cnblogs.com/zqsky/p/7899195.html
Copyright © 2011-2022 走看看