我是靠谱客的博主 无心鸡,最近开发中收集的这篇文章主要介绍多线程中的公平锁和非公平锁,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一.公平锁与非公平锁概念:
    锁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()启动的线程不代表先获得锁。

最后

以上就是无心鸡为你收集整理的多线程中的公平锁和非公平锁的全部内容,希望文章能够帮你解决多线程中的公平锁和非公平锁所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部