文档章节

Java并发编程初级篇(十五):使用公平锁

阿拉德大陆的魔法师
 阿拉德大陆的魔法师
发布于 2016/11/25 11:40
字数 345
阅读 392
收藏 0

精选30+云产品,助力企业轻松上云!>>>

Java API提供的Lock接口实现ReentrantLock类还有一个带有boolean参数的构造方法,使用true作为参数就可以创建一个公平锁,使用公平锁时锁会选择等待时间最长的一个线程。

我们直接修改“Java并发编程初级篇(十三):使用锁来实现同步机制”的代码,使用公平锁替代非公平锁。

public class PrintQueue {
    private Lock queueLock = new ReentrantLock(true);

    public void printJob(Object document) {
        queueLock.lock();
        try {
            long duration = (long)(Math.random() * 10000);
            System.out.printf("%s: Print a Job during %d\n",
                    Thread.currentThread().getName(), duration / 1000);
            Thread.sleep(duration);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            queueLock.unlock();
        }
    }
}

每次创建线程间隔100毫秒 ,是为了基本保证线程可以按照创建顺序来竞争锁。

public class Main {
    public static void main(String[] args) throws InterruptedException {
        PrintQueue printQueue = new PrintQueue();
        Job job = new Job(printQueue);

        for (int i = 1; i <= 10; i++) {
            Thread thread = new Thread(job);
            thread.start();
            Thread.sleep(100);
        }
    }
}

启动应用,查看控制台日志,你会发现线程是按照创建顺序来执行的。

Thread-0: Print a Job during 5
Thread-1: Print a Job during 8
Thread-2: Print a Job during 6
Thread-3: Print a Job during 6
Thread-4: Print a Job during 9
Thread-5: Print a Job during 2
Thread-6: Print a Job during 4
Thread-7: Print a Job during 9
Thread-8: Print a Job during 0
Thread-9: Print a Job during 2

 

阿拉德大陆的魔法师
粉丝 28
博文 91
码字总数 83019
作品 0
西城
程序员
私信 提问
加载中
请先登录后再评论。
Java并发编程锁系列之ReentrantLock对象总结

Java并发编程锁系列之ReentrantLock对象总结 在Java并发编程中,根据不同维度来区分锁的话,锁可以分为十五种。ReentranckLock就是其中的多个分类。 本文主要内容:重入锁理解;重入锁代码演示...

中凯_凯哥java
04/05
4
0
Java并发编程锁系列之ReentrantLock对象总结

Java并发编程锁系列之ReentrantLock对象总结 在Java并发编程中,根据不同维度来区分锁的话,锁可以分为十五种。ReentranckLock就是其中的多个分类。 本文主要内容:重入锁理解;重入锁代码演示...

凯哥Java
04/05
0
0
Java并发编程锁系列之ReentrantLock对象总结

Java并发编程锁系列之ReentrantLock对象总结 在Java并发编程中,根据不同维度来区分锁的话,锁可以分为十五种。ReentranckLock就是其中的多个分类。 本文主要内容:重入锁理解;重入锁代码演示...

kaizi1992
04/05
0
0
2019/10/22-2019/11/22计划清单

1.学习Java编程思想多线程基础,看、思考、敲,总结,成体系。 2.学习掘金的多线程面试题,能透彻探究、理解各面试题的答案。 Java并发控制机制 Java多线程面试基础篇 Java 线程面试题 Top ...

咫尺酱心
2019/10/22
1
0
Java多线程系列目录(共43篇)

Java多线程系列目录(共43篇) 转载 2016年03月30日 10:46:28 627 最近,在研究Java多线程的内容目录,将其内容逐步整理并发布。 (一) 基础篇 01. Java多线程系列--“基础篇”01之 基本概念 02...

osc_p8zyme9p
2018/02/13
1
0

没有更多内容

加载失败,请刷新页面

加载更多

java使用jsoup时绕过https证书验证

java 代码 增加一个工具类 在jsoup获取之前调用此方法 //your codeSSLHelper.init();Connection connect = Jsoup.connect(url).userAgent(USER_AGENT);connect.header("Accept","text/htm......

MeiJM
29分钟前
30
0
6 Message 消息提示框

1 element.js导入message import { Message } from 'element-ui'# 赋值给变量,便于this调用Vue.prototype.$message = Message 2 调用 this.$message.error('错误')类型有:success,w......

书阳
29分钟前
16
0
聊聊rocketmq-client-go的strategy

序 本文主要研究一下rocketmq-client-go的strategy AllocateStrategy rocketmq-client-go-v2.0.0/consumer/strategy.go type AllocateStrategy func(string, string, []*primitive.MessageQ......

go4it
57分钟前
21
0
BuildRun低代码开发教程八节 | 图表和仪表盘展示

课程说明 ▍ 1.1 课程实现功能 本课程为物联网应用平台设计一个仪表盘首页,包括以下内容: 卡片展示设备总数; 卡片展示网关总数; 卡片展示产品总数; 卡片展示产品分组总数; 图表展示各运...

BuildRun团队
今天
23
0
JavaSE第03篇:Java基础语法之运算符和流程控制

本章将会延续JavaSE第02篇,详细讲解Java基础语法中的运算符和流程控制中的顺序结构、分支结构。 第一章:运算符 运算符,简而言之就是运算的符号。 我们通常所理解的运算一般和数学有关系,...

雷哒哒
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部