3 回答
TA贡献1859条经验 获得超6个赞
据我所知,
foo
和bar
方法的工作一样。
正确。它们都在 上同步this
。
线程 A 进入
bar
方法并通过 同步实例后synchronized(this)
,任何线程都可以调用normal
方法吗?
是的。正确的。
据我所知,
normal
无论调用foo
方法,某些线程都可以调用方法。但我不确定何时调用 bar 方法。因为它同步了一个实例。
foo
并且bar
是一样的。它们都在 上同步this
。该normal
方法不同步任何东西。因此,它可以随时从任何地方调用,并且不会在方法调用时或内部阻塞。
在您的术语中,该normal
方法不是关键部分1。
静态的第二个例子
在这里,有同样的问题。线程 A 进入临界区后,任何线程都可以调用
synchronized(StaticMyClass.class)
或fooStatic
方法normalStatic
吗?
是的。在fooStatic
和barStatic
上都能够同步StaticMyClass.class
。
我认为,呼叫
fooStatic
和normalStatic
可以独立调用,但barStatic
并normalStatic
不能。
不正确。在normalStatic
不被挡fooStatic
OR barStatic
。
我不确定你从哪里得到normalStatic
可能被阻塞的想法......但它是一个正常的方法调用并且不获取任何内在锁,所以它不能被锁阻塞。
你的第三个例子不清楚。代码显示了一件事,但问题提出了不同/不相关的问题。
1 - 如果(例如)foo
或在持有内在锁时bar
调用它可能会有点混乱normal
。然后normal
代码将有效地位于临界区,因为调用者持有锁。但它 ( normal
) 通常不会知道这一点。这就是为什么我更喜欢避免使用“临界区”术语的原因。
TA贡献1777条经验 获得超10个赞
如果您没有指定谁是监视器,那么对于实例方法,监视器就是实例(this),对于静态方法,监视器就是类(YourClass.class)。
这段代码
public synchronized void foo() { //do something }
和这个一样
public void foo() { synchronized(this) { //do something }}
和这段代码
public static synchronized void fooStatic() { //do something }
和这个一样
public static void fooStatic() { synchronized(StaticMyClass.class) { //do something } }
所以,在这两种情况下,foo 和 bar 都是依赖的(同时只有一个线程),而 normal 可以独立调用。
TA贡献2039条经验 获得超7个赞
但是线程A进入bar方法并通过synchronized(this)同步实例后,任何线程都可以调用正常的方法吗?
对同一对象的同步方法的两次调用不可能交错。当一个线程正在为一个对象执行同步方法时,所有其他调用同一个对象的同步方法的线程都会阻塞(挂起执行),直到第一个线程完成对对象的处理。
如果您尝试调用其他未同步的方法,则有可能。
线程A进入synchronized(StaticMyClass.class)或fooStatic方法的临界区后,任何线程都可以调用normalStatic吗?我认为,调用 fooStatic 和 normalStatic 可以独立调用,但是 barStatic 和 normalStatic 不能。如果错了,为什么?
其他未同步的方法可以独立调用,但是当您调用 barStatic() 时,不可能调用其他方法,因为您正在同步整个类。其他线程,必须等到当前线程完成执行。
添加回答
举报