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.youkuaiyun.com/xinbumi/article/details/89918628

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

在多线程编程中,是一种同步机制,用于控制多个线程对共享资源的互斥访问。公平和非公平的两种类型,它们的区别主要在于线程获取的顺序。 公平(Fair Lock): 公平是指按照请求的线程的先来后到顺序来分配。也就是说,在可用时,最先请求的线程将会获得。为了实现这个机制,通常会维护一个等待队列。当一个线程释放时,会首先查看等待队列中是否有其他线程在等待这个,如果有,则按队列的顺序将分配给等待时间最长的线程。 非公平(Non-fair Lock): 非公平则不保证线程获取的顺序。当被释放时,它不会去检查等待队列,而是直接尝试获取。如果此时没有其他线程正在使用,那么当前线程就可以直接获取。这种的优点是线程获取的开销较小,因为避免了检查和维护等待队列的开销,但是这也可能导致某些线程长时间无法获取到,从而在某些情况下造成饥饿问题。 实现原理: - 公平通常是通过维护一个先进先出的队列来实现的。在JDK中,像ReentrantLock这样的类提供了公平的实现。在内部,它使用一个名为FairSync的同步器来管理状态和等待队列。 - 非公平则没有维护队列,当可用时,它只是简单地检查状态。如果未被占用,则直接将分配给请求者。ReentrantLock的默认构造函数创建的就是一个非公平,它使用的是NonfairSync同步器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值