zoukankan      html  css  js  c++  java
  • Lock的公平锁与非公平锁

    注:lock是可重入锁

    lock锁分为两类:公平锁和非公平锁。按照本人的理解,公平锁指的是在多个线程同时获取锁时,会按照该线程的请求先后顺序来决定哪个线程优先获取到锁(即:根据同步队列中的线程顺序来决定),非公平锁则是自由竞争,和线程的等待时间无关。

    而且非公平锁可能出现一个线程连续获取锁的现象(原因是当一个线程请求锁时,只要获取了同步状态即成功获取锁。在这个前提下,刚释放的线程再次获取同步状态的几率非常大)

    package com.zhl.practice;
    
    import org.junit.Test;
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.List;
    import java.util.concurrent.locks.ReentrantLock;
    
    /**
     * @author Holley
     * @Description 公平锁与非公平锁的演示
     * @create 2019-05-16 10:16
     **/
    public class LockTest {
    
        private static ReenTrantLock2 fairLock = new ReenTrantLock2(true);
    
        private static ReenTrantLock2 nonfairLock = new ReenTrantLock2(false);
    
        @Test
        public void fair(){
            testLock(fairLock);
        }
    
        @Test
        public void unfair(){
            testLock(nonfairLock);
        }
    
        private void testLock(ReenTrantLock2 lock){
            for(int i = 0; i<5;i++){
                Job job = new Job(lock);
                job.start();
            }
        }
    
        private static class Job extends Thread{
    
            private ReenTrantLock2 lock;
    
            public Job(ReenTrantLock2 lock){
                this.lock = lock;
            }
    
            @Override
            public void run() {
                lock.lock();
                System.out.println("当前线程:" + this.getName() + "等待线程:" + lock.getQueuedThreads().toString());
                lock.unlock();
                lock.lock();
                System.out.println("当前线程:" + this.getName() + "等待线程:" + lock.getQueuedThreads().toString());
                lock.unlock();
            }
        }
        private static class ReenTrantLock2 extends ReentrantLock{
            public ReenTrantLock2(Boolean flag){
                super(flag);
            }
    
            public Collection<Thread> getQueuedThreads(){
    //            System.out.println(super.getQueuedThreads());
                List<Thread> list = new ArrayList<>(super.getQueuedThreads());
                return list;
            }
        }
    
    }

     【注意】thread.start()方法与thread.run()方法的区别是:start()方法会创建一条新的线程,而run()方法则只是thread的一个普通方法,代码案例可见:https://blog.csdn.net/xinbumi/article/details/89918628

  • 相关阅读:
    使用HtmlAgilityPack将HtmlTable填入DataTable
    用EXCEL的VBA将PHPCMS的备份文件转换成HTML的一次尝试
    从微观角度看到宏观世界
    洛克菲特:如何管好你的钱包
    论永生_基因编辑
    如何隐藏自己的应用程序在服务器上不被发现?
    检视阅读
    改变了我对英语理解的语法课
    Rick And Morty使命必达与毁灭--------英语笔记
    文件太大,网速太慢,如何高效的传递到服务器上运行
  • 原文地址:https://www.cnblogs.com/zhlblogs/p/10874793.html
Copyright © 2011-2022 走看看