博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程阻塞释放的5种方法
阅读量:5231 次
发布时间:2019-06-14

本文共 2456 字,大约阅读时间需要 8 分钟。

1 LockSupport类

  • 底层使用Unsafe类
private static void block1(Thread thread) {    new Thread(() -> {        LockSupport.parkNanos(THREE_SECOND);        LockSupport.unpark(thread);    }).start();    LockSupport.park();}

2 Unsafe类

private static void block2(Thread thread) {    try {        Field f = Unsafe.class.getDeclaredField("theUnsafe");        f.setAccessible(true);        Unsafe unsafe = (Unsafe) f.get(null);        new Thread(() -> {            LockSupport.parkNanos(THREE_SECOND);            unsafe.unpark(thread);        }).start();        unsafe.park(false, 0L);    } catch (NoSuchFieldException | IllegalAccessException e) {        e.printStackTrace();    }}

3 Object类

private static void block3(Thread thread) {    new Thread(() -> {        LockSupport.parkNanos(THREE_SECOND);        synchronized (thread) {            thread.notify();        }    }).start();    synchronized (thread) {        try {            thread.wait(); // 释放锁        } catch (InterruptedException e) {            e.printStackTrace();        }    }}

4 CountDownLatch类

private static void block4() {    CountDownLatch latch = new CountDownLatch(1);    new Thread(() -> {        LockSupport.parkNanos(THREE_SECOND);        latch.countDown();    }).start();    try {        latch.await();    } catch (InterruptedException e) {        e.printStackTrace();    }}

5 自旋

private static void block5() {    AtomicBoolean flag = new AtomicBoolean(true);    new Thread(() -> {        LockSupport.parkNanos(THREE_SECOND);        flag.set(false);    }).start();    while (flag.get()) {    }}

6 测试

  • 测试误差排行(非准确测试): 自旋 < Unsafe < CountDownLatch < Object < LockSupport
public class Main {    private static final long THREE_SECOND = 3_000_000_000L;    private static final int times = 10;    public static void main(String[] args) {        System.out.println(System.currentTimeMillis() + ":start");        Thread thread = Thread.currentThread();        long diff = 0;        for (int i = 0; i < times; i++) {            long start = System.nanoTime();            block1(thread);//4364820            //block2(thread);//3881931            //block3(thread);//4358189            //block4(); // 4309549            //block5(); // 3473868            diff += Math.abs(System.nanoTime() - start - THREE_SECOND);        }        System.out.println("block diff Time:"+diff / times);        System.out.println(System.currentTimeMillis() + ":end");    }}

转载于:https://www.cnblogs.com/linzhanfly/p/9866543.html

你可能感兴趣的文章
第二次项目冲刺(Beta阶段)5.24
查看>>
python的多行注释
查看>>
连接Oracle需要jar包和javadoc文档的下载
查看>>
UVA 10976 - Fractions Again?!
查看>>
Dreamweaver cc新版本css单行显示
查看>>
【android】安卓的权限提示及版本相关
查看>>
JavaScript可否多线程? 深入理解JavaScript定时机制
查看>>
IOS基础学习
查看>>
PHP 导出 Excell
查看>>
Java基础教程——网络基础知识
查看>>
自己到底要的是什么
查看>>
Kruskal基础最小生成树
查看>>
ubuntu 14.04 安装搜狗拼音输入法
查看>>
浅谈算法和数据结构: 一 栈和队列
查看>>
Java内部类详解
查看>>
17 案例
查看>>
【hdu 1429】胜利大逃亡(续)
查看>>
SQL字符型转日期型
查看>>
Java程序设计教程(第2版)阅读总结
查看>>
图论-次短路求法
查看>>