文档章节

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

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

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

 

© 著作权归作者所有

共有 人打赏支持
阿拉德大陆的魔法师
粉丝 26
博文 91
码字总数 83019
作品 0
西城
程序员
私信 提问
15《Java核心技术》之synchronized和ReentrantLock有什么区别呢?

一、提出问题 从今天开始,我们将进入 Java 并发学习阶段。软件并发已经成为现代软件开发的基础能力,而 Java 精心设计的高效并发机制,正是构建大规模应用的基础之一,所以考察并发基本功也...

飞鱼说编程
2018/11/05
0
0
synchronized ReentrantLock 比较分析

     在编写多线程代码的时候,对于不允许并发的代码,很多需要加锁进行处理。在进行加锁处理时候,synchronized作为java的内置锁,同时也是java关键字,最为被人熟知,即使是最初级的j...

阿姆斯特朗回旋炮
2018/07/18
0
0
【死磕Java并发】—– 死磕 Java 并发精品合集

【死磕 Java 并发】系列是 LZ 在 2017 年写的第一个死磕系列,一直没有做一个合集,这篇博客则是将整个系列做一个概览。 先来一个总览图: 【高清图,请关注“Java技术驿站”公众号,回复:脑...

chenssy
2018/07/22
0
0
Java核心(三)并发中的线程同步与锁

乐观锁、悲观锁、公平锁、自旋锁、偏向锁、轻量级锁、重量级锁、锁膨胀...难理解?不存的!来,话不多说,带你飙车。 上一篇介绍了线程池的使用,在享受线程池带给我们的性能优势之外,似乎也...

王磊的博客
2018/11/22
0
0
【Java并发专题】27篇文章详细总结Java并发基础知识

努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事! github:https://github.com/CL0610/Java-concurrency,欢迎题issue和Pull request。所有的文档都是自己亲自码的,如果觉...

你听___
2018/05/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

cnetos7+docker+rancher构建基于DevOps的全自动CI【01】

来自DevOps实践分享,分享从开发代码到生产环境部署的一条龙操作的实践及经验, 包含工具技术的选型及考量、私有代码库与私有镜像库的应用等。 1、环境选择 安装Rancher环境,一定要在干净的...

Elson
13分钟前
0
0
21分钟教会你分析MaxCompute账单

背景 阿里云大计算服务MaxCompute是一款商业化的大数据分析平台,其计算资源有预付费和后付费两种计费方式。并且产品每天按照project为维度进行计量计费(账单基本情况下会第二天6点前产出)...

zhaowei121
17分钟前
0
0
CTO职场解惑指南系列(一)

基于科技能够改变世界的事实,几乎每个公司的程序员都自带闪光灯。程序员的手和普通人的手自然是有区别的,“我们可是用双手改变了世界” 。(码农真的是靠双手吃饭,呵呵) 这个世界上但凡靠...

阿里云云栖社区
21分钟前
0
0
css实现图片自适应容器宽高

css实现图片自适应容器宽高的做法一般如下所示 <style>div{width: 200px; height: 200px}div img{width: 100%; height: 100%}</style><div><img src="xxxx.png" /></div> 当外层容......

小草先森
21分钟前
0
0
PlatON在CentOS上编译部署

本文作者为万向区块链CTO罗荣阁。 目录 PlatON在CentOS上编译部署 1. CentOS 环境准备 1.1. 使用rpm 安装devtoolset-7 1.2. 使用rpm 安装dos2unix 1.3. 准备PlatON代码 1.4. 确保build脚本正...

万向区块链
30分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部