Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果线程在对象上获得了一个锁怎么办_Java_Multithreading - Fatal编程技术网

Java 如果线程在对象上获得了一个锁怎么办

Java 如果线程在对象上获得了一个锁怎么办,java,multithreading,Java,Multithreading,我参加了一次面试,遇到了一个问题,我对此有点困惑。 如果线程在对象上获得了锁,其他线程是否可以在同一对象上调用非同步方法?此: class SomeType { synchronized SomeOtherType Foobar() {...} } 这只是写这篇文章的捷径: class SomeType { SomeOtherType Foobar() { synchronized(this) { ... } }

我参加了一次面试,遇到了一个问题,我对此有点困惑。
如果线程在对象上获得了锁,其他线程是否可以在同一对象上调用非同步方法?

此:

class SomeType {
    synchronized SomeOtherType Foobar() {...}
}
这只是写这篇文章的捷径:

class SomeType {
    SomeOtherType Foobar() {
        synchronized(this) {
            ...
        }
    }
}
class SomeType {
    static SomeOtherType Foobar() {
        synchronized(SomeType.class) {
            ...
        }
    }
}
这是:

class SomeType {
    static synchronized SomeOtherType Foobar() {...}
}
这只是写这篇文章的捷径:

class SomeType {
    SomeOtherType Foobar() {
        synchronized(this) {
            ...
        }
    }
}
class SomeType {
    static SomeOtherType Foobar() {
        synchronized(SomeType.class) {
            ...
        }
    }
}
因此,关于“同步方法”的每一个问题都可以归结为关于同步块的问题

关于同步块,您需要了解的大部分内容可以总结为两句话:

  • JVM决不允许两个线程在同一实例上同步的块中同时执行
  • 一个线程在退出
    synchronized(o)
    块之前修改共享对象所做的任何操作,都保证在另一个线程进入同一实例上同步的任何块时,对另一个线程可见

  • *在
    synchronized(o)
    块中调用
    o.wait()
    会稍微复杂一些。wait()调用在开始等待之前释放锁,然后在返回前重新获取锁


    从技术上讲,任何数量的线程都可以在同一个实例的
    synchronized(o)
    块中“等待”
    o
    ,只要这些线程中只有一个在
    o.wait()
    调用中等待,但我更愿意说,只有一个线程可以在同步块中执行,而且“等待”不算作“执行”

    是的,他们可以。如果在采访中有人问我这个问题,我会要求在白板上查看示例代码。如上所述,这个问题可以用不止一种方式来解释。顺便说一句,我首先要指出,“同步方法”对于一个主体是同步块的方法来说,实际上只是一种语法糖。然后,我将只讨论同步块的行为,这更容易解释。