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

转载于:https://www.cnblogs.com/zhlblogs/p/10874793.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值