在 Java 中使用 synced (Thread.currentThread()){...} 的目的是什么?

在我们的项目中,我遇到了以下代码:

synchronized (Thread.currentThread()){
    //some code
}

我不明白在 上使用同步的原因。currentThread

两者之间有什么区别吗?

synchronized (Thread.currentThread()){
    //some code
}

而只是

//some code

您能举个例子来说明这种差异吗?

更新

此代码的更多详细信息,如下所示:

synchronized (Thread.currentThread()) {
       Thread.currentThread().wait(timeInterval);
}

它看起来只是.这是真理吗?Thread.sleep(timeInterval)


答案 1

考虑一下

    Thread t = new Thread() {
        public void run() { // A
            synchronized (Thread.currentThread()) {
                System.out.println("A");
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                }
            }
        }
    };
    t.start();
    synchronized (t) { // B
        System.out.println("B");
        Thread.sleep(5000);
    }

块A和B不能同时运行,因此在给定的测试中,“A”或“B”输出将延迟5秒,哪一个将首先出现是未定义的


答案 2

虽然这几乎肯定是一个反模式,应该以不同的方式解决,但你眼前的问题仍然需要一个答案。如果你的整个代码库从未在 除 以外的任何实例上获取锁,那么实际上这个锁永远不会被争用。但是,如果您在其他地方ThreadThread.currentThread()

synchronized (someSpecificThreadInstance) { ... }

那么这样的块将不得不与你显示的块争夺相同的锁。确实可能发生的情况是,到达的线程必须等待其他线程放弃锁定。synchronized (Thread.currentThread())


推荐