zoukankan      html  css  js  c++  java
  • 获取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
  • 相关阅读:
    小程序 图片和文字放在一行对齐的方法
    Linux下Redis安装使用教程
    关系型数据库和非关系型数据库的区别
    微信小程序scroll-view 横向和纵向scroll-view组件
    ThinkPHP5.0手把手实现手机阿里云短信验证
    极验(Geetest) Laravel 5 集成开发包,让验证更安全
    (进阶篇)PHP(thinkphp5框架)实现用户注册后邮箱验证,激活帐号
    详解PhpSpreadsheet设置单元格
    使用PhpSpreadsheet将Excel导入到MySQL数据库
    【JZOJ4783】【NOIP2016提高A组模拟9.15】Osu
  • 原文地址:https://www.cnblogs.com/softidea/p/5530798.html
Copyright © 2011-2022 走看看