Java中的é™æ€å’Œéžé™æ€åŒæ­¥

时间:2015-11-20 09:45:25

标签: java multithreading synchronization monitor

在this question中说过

  

åŒæ­¥é™æ€æ–¹æ³•å’ŒåŒæ­¥éžé™æ€æ–¹æ³•ä¹‹é—´æ²¡æœ‰é“¾æŽ¥

好的,这很简å•ï¼Œä½†æ˜¯å¦‚æžœéžé™æ€æ–¹æ³•ä¸­çš„代ç è°ƒç”¨é™æ€æ–¹æ³•å‘¢ï¼Ÿè¿™ä¸ªçº¿ç¨‹æ˜¯å¦ä¼šåŒæ—¶ä¿æŒé™æ€ï¼ˆä¸Žç±»å…³è”)和éžé™æ€ï¼ˆä¸Žç±»çš„实例关è”)监视器?

2 个答案:

答案 0 :(得分:2)

  

这个线程是å¦åŒæ—¶ä¿æŒé™æ€ï¼ˆä¸Žç±»ç›¸å…³ï¼‰å’Œ   éžé™æ€ï¼ˆä¸Žç±»çš„实例相关è”)监视?

是的,那是因为,

  

æ ¹æ®Java Language Specification 8.4.3.6,

     

对于一个类(é™æ€ï¼‰   方法,与方法的Class对象关è”的监视器   使用了类。对于实例方法,与之关è”的监视器   使用this(调用该方法的对象)。

毕竟2个监视器将分别定义。

答案 1 :(得分:1)

没有任何"é™æ€åŒæ­¥ï¼†ï¼ƒ34;或"éžé™æ€åŒæ­¥ï¼†ï¼ƒ34;。这些想法éšè—了真正å‘生的事情。

此:

class Foobar {
    static synchronized void mumble() { ... }
}

åªæ˜¯å†™è¿™ç¯‡æ–‡ç« çš„æ·å¾„:

class Foobar {
    static void mumble() {
        synchronized(Foobar.class) {
            ...
        }
    }
}

而且:

class Foobar {
    synchronized void grumble() { ... }
}

åªæ˜¯å†™è¿™ç¯‡æ–‡ç« çš„æ·å¾„:

class Foobar {
    void grumble() {
        synchronized(this) {
            ...
        }
    }
}

谈论"é™æ€åŒæ­¥ï¼†ï¼ƒ34;没有æ„义。因为åŒæ­¥æ˜¯ä½ å¯¹å¯¹è±¡æ‰€åšçš„事情,并且没有é™æ€å¯¹è±¡è¿™æ ·çš„东西。 Java中唯一å¯ä»¥æ˜¯static的东西是å˜é‡å’Œæ–¹æ³•ã€‚

P.S。,回答你的问题,

当线程进入åŒæ­¥å—或方法时,如果线程尚未é”定该对象,则必须获å–指定对象的é”定。因此,如果f.grumble()在上é¢çš„示例中调用mumble(),则线程首先必须在f进入grumble()例程时获å–é”定,然åŽï¼Œåœ¨ä»ç„¶æŒæœ‰è¯¥é”定时,它还必须获得Foobar.classçš„é”定。