2 tongyiwzh tongyiwzh 于 2016.09.08 10:50 提问

Java中线程wait是如何实现微秒级别识别外界的唤醒动作的

一直以来都惊奇于java是如何实现微秒级别唤醒一个处于wait状态的线程的,今天我通过下面的
程序测试了一下,主线程从调用 notify 到唤醒一个处于 wait 状态的子线程,之间的时间间隔小
于7微秒,这是一个非常短的时间,想知道java在这方面的底层实现原理是什么,有没有其他类似的
的工具也能实现这种耗时非常短的协调交互功能?
为什么想了解这个呢,因为我最近想做个在分布式环境下线程互相协调的工具,其中一个基础功
能需要让一个线程能尽快识别其他线程对临界资源的更新,因为不再是单JVM环境了,所以无法使用线程临界区的 notify, wait 机制快速唤醒另外一个等待的线程了,在分布式环境下,希望一个处于等待状态的线程通过自旋等待的方式尽快识别临界区资源的变动,用 while + sleep 方式还是延迟太大了,希望能从 wait + notify 的实现原理中找下思路,或者各位有更好的推荐方案也行。

下面是我测试 wait , notify 时间间隔的代码,有兴趣的可以看下:

public class TestThreadWait {
public static void main(String[] args) {
Object lock = new Object();
T1 thread = new T1(lock);
thread.start();

    try {
        Thread.sleep(500);
    } catch (InterruptedException e1) {
        e1.printStackTrace();
    }

    long time1 = 0l;
    long time2 = 0l;
    synchronized(lock) {
        time1 = System.nanoTime();
        lock.notify();
        time2 = System.nanoTime();
    }
    System.out.println("main thread notify time info : time1 = " + time1 + ", time2 = " + time2 + ", cost : " + (time2-time1));
}

static class T1 extends Thread {
    private Object lock;

    public T1(Object lock) {
        this.lock = lock;
    }

    public void run() {
        long time1 = 0l;
        long time2 = 0l;
        synchronized(this.lock) {
            try {
                time1 = System.nanoTime();
                this.lock.wait();
                time2 = System.nanoTime();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        System.out.println("thread wait time info : time1 = " + time1 + ", time2 = " + time2 + ", cost : " + (time2-time1));
    }
}

}

1个回答

tongyiwzh
tongyiwzh   2016.09.08 13:46

没人对这个有兴趣吗?

Csdn user default icon
上传中...
上传图片
插入图片