获取synchronized锁中的阻塞队列中的线程是非公平的
synchronized中阻塞队列的线程是非公平的
测试demo:
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit; public class SleepState { public static ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSZ");
}
}; private static final int[] lock = new int[0]; public static void main(String[] args) throws InterruptedException {
Thread thread1 = new Thread(new TestSynchronizedTask(lock, 1000 * 10), "Thread1");
Thread thread2 = new Thread(new TestSynchronizedTask(lock, 10), "Thread2");
Thread thread3 = new Thread(new TestSynchronizedTask(lock, 1000), "Thread3");
thread1.start();
TimeUnit.MILLISECONDS.sleep(1000);
thread2.start();
TimeUnit.MILLISECONDS.sleep(1000);
thread3.start();
}
} class TestSynchronizedTask implements Runnable {
private final int[] lock;
private int sleepMilliSeconds; public TestSynchronizedTask(int[] lock, int sleepMilliSeconds) {
this.lock = lock;
this.sleepMilliSeconds = sleepMilliSeconds;
} public TestSynchronizedTask(int[] lock) {
this(lock, 0);
} @Override
public void run() {
synchronized (lock) {
try {
System.out.println(MessageFormat.format(" {0} {1} begin", SleepState.threadLocal.get().format(new Date()), Thread.currentThread()));
TimeUnit.MILLISECONDS.sleep(sleepMilliSeconds);
System.out.println(MessageFormat.format("{0} {1} will end", SleepState.threadLocal.get().format(new Date()), Thread.currentThread()));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
执行结果:
2016-05-26 13:31:44.260+0800 Thread[Thread1,5,main] begin
2016-05-26 13:31:54.260+0800 Thread[Thread1,5,main] will end
2016-05-26 13:31:54.260+0800 Thread[Thread3,5,main] begin
2016-05-26 13:31:55.260+0800 Thread[Thread3,5,main] will end
2016-05-26 13:31:55.260+0800 Thread[Thread2,5,main] begin
2016-05-26 13:31:55.276+0800 Thread[Thread2,5,main] will end
获取synchronized锁中的阻塞队列中的线程是非公平的的更多相关文章
- java高并发系列 - 第25天:掌握JUC中的阻塞队列
这是java高并发系列第25篇文章. 环境:jdk1.8. 本文内容 掌握Queue.BlockingQueue接口中常用的方法 介绍6中阻塞队列,及相关场景示例 重点掌握4种常用的阻塞队列 Queu ...
- Java中的阻塞队列
1. 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列.这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空.当队列满时,存储元素的线程会等待队列可用 ...
- 聊聊并发(七)——Java中的阻塞队列
3. 阻塞队列的实现原理 聊聊并发(七)--Java中的阻塞队列 作者 方腾飞 发布于 2013年12月18日 | ArchSummit全球架构师峰会(北京站)2016年12月02-03日举办,了解更 ...
- Java中的阻塞队列(BlockingQueue)
1. 什么是阻塞队列 阻塞队列(BlockingQueue)是 Java 5 并发新特性中的内容,阻塞队列的接口是 java.util.concurrent.BlockingQueue,它提供了两个附 ...
- Java中的阻塞队列-LinkedBlockingQueue(二)
原文地址:http://benjaminwhx.com/2018/05/11/%E3%80%90%E7%BB%86%E8%B0%88Java%E5%B9%B6%E5%8F%91%E3%80%91%E8 ...
- Java中的阻塞队列-ArrayBlockingQueue(一)
最近在看一些java基础的东西,看到了队列这章,打算对复习的一些知识点做一个笔记,也算是对自己思路的一个整理,本章先聊聊java中的阻塞队列 参考文章: http://ifeve.com/java-b ...
- 多线程编程学习六(Java 中的阻塞队列).
介绍 阻塞队列(BlockingQueue)是指当队列满时,队列会阻塞插入元素的线程,直到队列不满:当队列空时,队列会阻塞获得元素的线程,直到队列变非空.阻塞队列就是生产者用来存放元素.消费者用来获取 ...
- 阻塞队列一——java中的阻塞队列
目录 阻塞队列简介:介绍阻塞队列的特性与应用场景 java中的阻塞队列:介绍java中实现的供开发者使用的阻塞队列 BlockQueue中方法:介绍阻塞队列的API接口 阻塞队列的实现原理:具体的例子 ...
- JUC之Java中的阻塞队列及其实现原理
在文章线程池实现原理 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中介绍了线程池的组成部分,其中一个组成部分就是阻塞队列.那么JAVA中的阻塞队列如何实现的呢? 阻塞队列,关键字是阻塞 ...
随机推荐
- Android Dialog详解
前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net ...
- 利用MySQL 的GROUP_CONCAT函数实现聚合乘法
MySQL 聚合函数里面提供了加,平均数.最小,最大等,可是没有提供乘法,我们这里来利用MYSQL现有的GROUP_CONCAT函数实现聚合乘法. 先创建一张演示样例表: CREATE TABLE ` ...
- 转:c语言EOF是什么?(及getchar()和putchar用法)
我学习C语言的时候,遇到的一个问题就是EOF. 它是end of file的缩写,表示"文字流"(stream)的结尾.这里的"文字流",可以是文件(file) ...
- AT&T汇编
AT&T汇编和8086汇编语言虽然两者很相似,但是还是不能根据8086的语法规则来读AT&T汇编的吧,所以还是要看看AT&T汇编的语法规则,因为在读内核代码时,跟硬件打交道的部 ...
- C++和JNI的数据转换
链接地址:http://blog.csdn.net/manymore13/article/details/19078713 转载地址:http://www.cnblogs.com/daniel-she ...
- Eclipse用法和技巧二十七:定义自己的快速联想词
某天在调试代码的时候,虽然是android的project还是习惯的输入syso,然后在ALT+/一下.旁边的同事就问了一下,这个log打印输出的tag是什么.接着又问了为什么syso能够智能联想出这 ...
- Core 中文文档
ASP.NET Core 中文文档 第二章 指南(1)用 Visual Studio Code 在 macOS 上创建首个 ASP.NET Core 应用程序 原文:Your First ASP. ...
- perl 类里的函数调用其他类的函数
perl 类里的函数调用其他类的函数: package Horse; use base qw(Critter); sub new { my $invocant = shift; my $class = ...
- 社交舞 - 简介,释名,风格,舞步 - 金山词霸汉语 - HAPPY Life
社交舞 - 简介,释名,风格,舞步 - 金山词霸汉语 - HAPPY Life 社交舞 编辑词条 创建词条 内容来源 社交舞(英语:ballroom dance),又称交谊舞或交际舞,是来源于西方的一 ...
- 关于 iOS 基础动画
1,首先,在iOS中,动画有2种,一种是对 UIView 做动画处理,另一种是对 CALayer做动画. 这里我们先要搞清楚 UIView 与 CALayer 之间的关系,UIView 是界面的基础元 ...