栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Lock(三) 公平和非公平

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Lock(三) 公平和非公平

一、解析

为什么要非公平锁:

、避免唤醒的带来的空档期。

、空档期的效率。

代码演示:

public class FairLock {

    public static void main(String[] args) {
        PrintQueue printQueue = new PrintQueue();
        Thread thread[] = new Thread[10];
        for (int i = 0; i < 10; i++) {
            thread[i] = new Thread(new Job(printQueue));
        }

        for (int i = 0; i < 10; i++) {
            thread[i].start();
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }


    }

}

class Job implements Runnable {

    PrintQueue printQueue;

    public Job(PrintQueue printQueue) {
        this.printQueue = printQueue;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " 开始打印");
        printQueue.printJob(new Object());
        System.out.println(Thread.currentThread().getName() + " 开始结束");

    }
}
class PrintQueue{
    private Lock queueLock = new ReentrantLock(false); //设置公平 true / 非公平 false

    public void printJob(Object document) {
        queueLock.lock();
        try {
            int duration = new Random().nextInt(10) + 1;
            System.out.println(Thread.currentThread().getName() + "正在打印,需要 " + duration);
            Thread.sleep(duration * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            queueLock.unlock();
        }
        queueLock.lock();
        try {
            int duration = new Random().nextInt(10) + 1;
            System.out.println(Thread.currentThread().getName() + "正在打印,需要 " + duration);
            Thread.sleep(duration * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            queueLock.unlock();
        }
    }
}

 打印结果(公平):

Thread-0 开始打印
Thread-0正在打印,需要 7
Thread-1 开始打印
Thread-2 开始打印
Thread-3 开始打印
Thread-4 开始打印
Thread-5 开始打印
Thread-6 开始打印
Thread-7 开始打印
Thread-8 开始打印
Thread-9 开始打印
Thread-1正在打印,需要 5
Thread-2正在打印,需要 10
Thread-3正在打印,需要 5
Thread-4正在打印,需要 4
Thread-5正在打印,需要 7
Thread-6正在打印,需要 2
Thread-7正在打印,需要 1
Thread-8正在打印,需要 9
Thread-9正在打印,需要 10
Thread-0正在打印,需要 8
Thread-0 开始结束
Thread-1正在打印,需要 1
Thread-1 开始结束
Thread-2正在打印,需要 5
Thread-2 开始结束
Thread-3正在打印,需要 2
Thread-3 开始结束
Thread-4正在打印,需要 9
Thread-4 开始结束
Thread-5正在打印,需要 1
Thread-5 开始结束
Thread-6正在打印,需要 7
Thread-6 开始结束
Thread-7正在打印,需要 10
Thread-7 开始结束
Thread-8正在打印,需要 7
Thread-8 开始结束
Thread-9正在打印,需要 1
Thread-9 开始结束
Disconnected from the target VM, address: '127.0.0.1:50215', transport: 'socket'

打印结果(非公平):

Thread-0 开始打印
Thread-0正在打印,需要 7
Thread-1 开始打印
Thread-2 开始打印
Thread-3 开始打印
Thread-4 开始打印
Thread-5 开始打印
Thread-6 开始打印
Thread-7 开始打印
Thread-8 开始打印
Thread-9 开始打印
Thread-0正在打印,需要 4
Thread-0 开始结束
Thread-1正在打印,需要 6
Thread-1正在打印,需要 8
Thread-1 开始结束
Thread-2正在打印,需要 6
Thread-2正在打印,需要 3
Thread-2 开始结束
Thread-3正在打印,需要 4
Thread-3正在打印,需要 8
Thread-3 开始结束
Thread-4正在打印,需要 8
Thread-4正在打印,需要 4
Thread-4 开始结束
Thread-5正在打印,需要 8
Thread-5正在打印,需要 1
Thread-5 开始结束
Thread-6正在打印,需要 10
Thread-6正在打印,需要 2
Thread-6 开始结束
Thread-7正在打印,需要 8
Thread-7正在打印,需要 9
Thread-7 开始结束
Thread-8正在打印,需要 6
Thread-8正在打印,需要 9
Thread-8 开始结束
Thread-9正在打印,需要 1
Thread-9正在打印,需要 6
Thread-9 开始结束

Process finished with exit code 0

 源码展示: 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/340472.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号