带有 var=Thread.currentThread() 的代码块上的 synchronized(...) [重复]

Posted

技术标签:

【中文标题】带有 var=Thread.currentThread() 的代码块上的 synchronized(...) [重复]【英文标题】:synchronized(...) on a code block with var=Thread.currentThread() [duplicate] 【发布时间】:2015-08-12 02:26:05 【问题描述】:

我正在阅读这个类的代码:

public class MultiThreadedServer implements Runnable 
    // some more code
    protected Thread runningThread = null;

    public void run() 
        synchronized(this) 
            this.runningThread = Thread.currentThread();
        
        // lots of code
    

这是什么意思?线程本身用作锁定资源的标志?我完全不明白。

有人知道吗?

【问题讨论】:

// blablahbla - // lots of blahblahblah - 这对我来说是不行的。 this 指向MultiThreadedServer 的实例,而不是线程(它的标识符无效) 我喜欢protected Thread running thread = null;中的空间 它不使用线程作为锁,它使用 Runnable 对象。是否将同一对象分配给多个线程? Runnable中还有其他同步的方法吗? 啊,错字了,对不起各位。 @Steven Pessall 在此方法中没有同步其他任何内容。 【参考方案1】:

thisRunnable,而不是线程,因此在您编写时不是在线程本身上完成同步。

这可能有点令人困惑,但如果例如,它是非常可行的。该对象被多个并发线程访问。

干杯,

【讨论】:

所以它会同步 Runnable 以避免并发访问线程之间共享的 run() 方法? @Csi 不是整个 run 方法,而只是 synchronized(this)【参考方案2】:

this.runningThread = Thread.currentThread(); 简单地给你一个指向当前线程的链接。

这样您就不必一直调用Thread.currentThread(),从而节省了方法调用开销。

嗯,protected Thread running thread = null; 中的空格也无济于事......

【讨论】:

runningThread 字段不仅仅是为了方便,我非常怀疑它仅用于run 方法,特别是因为它被标记为protected 啊,runningThread 的错字,抱歉。

以上是关于带有 var=Thread.currentThread() 的代码块上的 synchronized(...) [重复]的主要内容,如果未能解决你的问题,请参考以下文章

多线程问题

可重入锁

synchronized重入测试

初步学习多线程3

java学习-每日一题-类加载死锁

如何将 ToLongDateString() 的日期和月份首字母大写导致 es-mx 文化?