获取synchronized锁中的阻塞队列中的线程是非公平的

简介: synchronized中阻塞队列的线程是非公平的   测试demo: import java.text.MessageFormat; import java.text.SimpleDateFormat; import java.

 

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

 

相关文章
|
6天前
|
运维 API 计算机视觉
深度解密协程锁、信号量以及线程锁的实现原理
深度解密协程锁、信号量以及线程锁的实现原理
14 1
|
1天前
|
安全 调度 数据安全/隐私保护
iOS线程锁
iOS线程锁
5 0
|
4天前
|
Java 编译器 程序员
【多线程】synchronized原理
【多线程】synchronized原理
21 0
|
4天前
|
Java API
【多线程】乐观/悲观锁、重量级/轻量级锁、挂起等待/自旋锁、公平/非公锁、可重入/不可重入锁、读写锁
【多线程】乐观/悲观锁、重量级/轻量级锁、挂起等待/自旋锁、公平/非公锁、可重入/不可重入锁、读写锁
17 0
|
4天前
|
消息中间件 NoSQL 关系型数据库
【多线程-从零开始-捌】阻塞队列,消费者生产者模型
【多线程-从零开始-捌】阻塞队列,消费者生产者模型
16 0
|
4天前
|
安全 Java 程序员
【多线程-从零开始-肆】线程安全、加锁和死锁
【多线程-从零开始-肆】线程安全、加锁和死锁
22 0
|
4天前
|
安全 Linux
Linux线程(十一)线程互斥锁-条件变量详解
Linux线程(十一)线程互斥锁-条件变量详解
|
22小时前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
11 1
C++ 多线程之初识多线程
|
16天前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
23天前
|
Java Spring
spring多线程实现+合理设置最大线程数和核心线程数
本文介绍了手动设置线程池时的最大线程数和核心线程数配置方法,建议根据CPU核数及程序类型(CPU密集型或IO密集型)来合理设定。对于IO密集型,核心线程数设为CPU核数的两倍;CPU密集型则设为CPU核数加一。此外,还讨论了`maxPoolSize`、`keepAliveTime`、`allowCoreThreadTimeout`和`queueCapacity`等参数的设置策略,以确保线程池高效稳定运行。
94 10
spring多线程实现+合理设置最大线程数和核心线程数