1 LockSupport类
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"); }}