多线程中的公平锁和非公平锁

一.公平锁与非公平锁概念:
    锁Lock分为"公平锁"和"非公平锁",公平锁表示线程获取锁的顺序是按照线程加锁的顺序分配的,即先来先得的FIFO先进先出的顺序,而非公平锁就是一个获取锁的抢占机制,是随机获得锁的,和公平锁不一样的就是先来的不一定先得到锁,这个当时可能造成某些线程一直拿不到锁,结果也就是不公平的了。

二.创建一个类,在构造中初始化ReentrantLock类,并传入boolean类型的参数,true表示公平,false表示非公平:

public class Service {
    private ReentrantLock lock;

    public Service(Boolean fair){
        super();
        lock = new ReentrantLock(fair);
    }

    public void serviceMethod(){
        try{
            lock.lock();
            System.out.println("ThreadName: "+Thread.currentThread().getName()+"获得锁定");
        }finally {
            lock.unlock();
        }
    }
}

三.测试公平锁:

1.demo演示:

public class FairLock {
    public static void main(String[] args) {
        /**
         *  true表示公平锁
         */
        final Service service = new Service(true);

        Runnable runnable = new Runnable(){
            @Override
            public void run() {
                System.out.println("★★★线程:"+Thread.currentThread().getName()+"运行了");
                service.serviceMethod();
            }
        };
        Thread[] thread = new Thread[10];
        for (int i=0;i<10;i++){
            thread[i] = new Thread(runnable);
        }
        for(int i=0;i<10;i++){
            thread[i].start();
        }
    }
}

2.测试结果:
在这里插入图片描述
3.解释:
打印结果基本是呈有序的状态,这就是公平锁的特点。

四.测试非公平锁:

1.demo演示:

public class UnfairLock {
    public static void main(String[] args) {
        final Service service = new Service(false);
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("★★★线程:"+Thread.currentThread().getName()+"运行了");
                service.serviceMethod();
            }
        };
        Thread[] threads = new Thread[10];
        for (int i=0; i<10; i++){
            threads[i] = new Thread(runnable);
        }
        for(int i=0; i<10; i++){
            threads[i].start();
        }
    }
}
/**
 *  并且说明先start启动的线程不代表先获得锁
 */

2.测试结果:
在这里插入图片描述
3.解释:
非公平锁的运行结果基本上是乱序的,说明先start()启动的线程不代表先获得锁。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值