zoukankan      html  css  js  c++  java
  • 公平锁和非公平锁

    Lock锁分为公平锁和非公平锁两种

    公平锁:线程获取锁的顺序是按照线程加锁的顺序来分配的,即先来先得的FIFO先进先出顺序

    非公平锁:一种获取锁的抢占机制,是随机获取锁的,和公平锁的区别就是先来的不一定先得到锁,导致某些线程可能一直拿不到锁,所以是不公平的

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

    --------------------------------------公平锁--------------------------------------

        protected final boolean tryAcquire(int acquires) {
                final Thread current = Thread.currentThread();
                int c = getState();
                if (c == 0) {//状态是0,说明当前线程没有占有锁
                    if (!hasQueuedPredecessors() &&
                        compareAndSetState(0, acquires)) {
                        setExclusiveOwnerThread(current);//当前线程占有锁
                        return true;
                    }
                }
                else if (current == getExclusiveOwnerThread()) {//如果当前线程本身持有锁,叠加状态值,继续持有
                    int nextc = c + acquires;
                    if (nextc < 0)
                        throw new Error("Maximum lock count exceeded");
                    setState(nextc);
                    return true;
                }
                return false;
            }
    ------------------------------------------------------------------
        public final boolean hasQueuedPredecessors() {
            // The correctness of this depends on head being initialized
            // before tail and on head.next being accurate if the current
            // thread is first in queue.
            Node t = tail; // Read fields in reverse initialization order
            Node h = head;
            Node s;
            return h != t &&
                ((s = h.next) == null || s.thread != Thread.currentThread());
        }

    --------------------------------------非公平锁--------------------------------------

        final boolean nonfairTryAcquire(int acquires) {
                final Thread current = Thread.currentThread();
                int c = getState();
                if (c == 0) {
                    if (compareAndSetState(0, acquires)) {
                        setExclusiveOwnerThread(current);
                        return true;
                    }
                }
                else if (current == getExclusiveOwnerThread()) {
                    int nextc = c + acquires;
                    if (nextc < 0) // overflow
                        throw new Error("Maximum lock count exceeded");
                    setState(nextc);
                    return true;
                }
                return false;
            }
  • 相关阅读:
    中国MOOC_零基础学Java语言_第1周 计算_第1周编程题_1温度转换
    郝斌_GUI
    郝斌_生产消费
    WCF技术剖析(卷1)WCF全面解析文摘
    构建搞性能可扩展asp.net网站文摘
    net 程序员面试宝典
    【工具推荐】ELMAH——可插拔错误日志工具(转)
    各大主流.Net的IOC框架性能测试比较(转)
    2013年总结
    GCT英语口语复试中的常见问题总汇
  • 原文地址:https://www.cnblogs.com/qf123/p/9761155.html
Copyright © 2011-2022 走看看