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锁中的阻塞队列中的线程是非公平的的更多相关文章

  1. java高并发系列 - 第25天:掌握JUC中的阻塞队列

    这是java高并发系列第25篇文章. 环境:jdk1.8. 本文内容 掌握Queue.BlockingQueue接口中常用的方法 介绍6中阻塞队列,及相关场景示例 重点掌握4种常用的阻塞队列 Queu ...

  2. Java中的阻塞队列

    1. 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列.这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空.当队列满时,存储元素的线程会等待队列可用 ...

  3. 聊聊并发(七)——Java中的阻塞队列

    3. 阻塞队列的实现原理 聊聊并发(七)--Java中的阻塞队列 作者 方腾飞 发布于 2013年12月18日 | ArchSummit全球架构师峰会(北京站)2016年12月02-03日举办,了解更 ...

  4. Java中的阻塞队列(BlockingQueue)

    1. 什么是阻塞队列 阻塞队列(BlockingQueue)是 Java 5 并发新特性中的内容,阻塞队列的接口是 java.util.concurrent.BlockingQueue,它提供了两个附 ...

  5. 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 ...

  6. Java中的阻塞队列-ArrayBlockingQueue(一)

    最近在看一些java基础的东西,看到了队列这章,打算对复习的一些知识点做一个笔记,也算是对自己思路的一个整理,本章先聊聊java中的阻塞队列 参考文章: http://ifeve.com/java-b ...

  7. 多线程编程学习六(Java 中的阻塞队列).

    介绍 阻塞队列(BlockingQueue)是指当队列满时,队列会阻塞插入元素的线程,直到队列不满:当队列空时,队列会阻塞获得元素的线程,直到队列变非空.阻塞队列就是生产者用来存放元素.消费者用来获取 ...

  8. 阻塞队列一——java中的阻塞队列

    目录 阻塞队列简介:介绍阻塞队列的特性与应用场景 java中的阻塞队列:介绍java中实现的供开发者使用的阻塞队列 BlockQueue中方法:介绍阻塞队列的API接口 阻塞队列的实现原理:具体的例子 ...

  9. JUC之Java中的阻塞队列及其实现原理

    在文章线程池实现原理 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中介绍了线程池的组成部分,其中一个组成部分就是阻塞队列.那么JAVA中的阻塞队列如何实现的呢? 阻塞队列,关键字是阻塞 ...

随机推荐

  1. 同步内核缓冲区 sync、fsync和fdatasync函数

    同步内核缓冲区 1.缓冲区简单介绍 人生三大错觉之中的一个:在调用函数write()时,我们觉得该函数一旦返回,数据便已经写到了文件里.可是这样的概念仅仅是宏观上的.实际上.操作系统实现某些文件I/O ...

  2. R语言RJava安装步骤

     1.安装JDK 2.在R下运行install.packages("rJava") 2.环境变量设置 CLASSPATH=xxx\R-xxx\library\rJava\jri ...

  3. Linux解压乱码

    .向系统添加windows下的字符编码: sudo vim /var/lib/locales/supported.d/local 添加一下编码: zh_CN.GBK GBK zh_CN.GB2312 ...

  4. 基于visual Studio2013解决C语言竞赛题之0906文件插入

       题目

  5. RedHat Linux 5.5安装JDK+Tomcat并部署Java项目

    与大家分享下RedHat Linux 5.5安装JDK+Tomcat并部署Java项目的步骤,希望对大家有用. 1.下载并安装jdk 虚拟机中安装RedHat Linux 5.5 64位企业版, 这里 ...

  6. Random Teams

    n participants of the competition were split into m teams in some manner so that each team has at le ...

  7. OC中线程的状态相关

    1.线程的状态NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; ...

  8. QT update和repaint的区别

    void QWidget::repaint ( int x, int y, int w, int h, bool erase = TRUE ) [槽] 通过立即调用paintEvent()来直接重新绘 ...

  9. android设置eclipse中的自动提示功能

    菜单window->Preferences->Java->Editor->Content Assist->Enable auto activation 选项要打上勾 (并 ...

  10. Jquery Mobile转场特效之slide | 小小iPhone开发

    Jquery Mobile转场特效之slide | 小小iPhone开发 2012 Jquery Mobile转场特效之slide 作者:小小   发布:2012-12-12 14:03   分类:j ...