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) {
...
}
}
}
因此,关于“同步方法”的每一个问题都可以归结为关于同步块的问题
关于同步块,您需要了解的大部分内容可以总结为两句话:
synchronized(o)
块之前修改共享对象所做的任何操作,都保证在另一个线程进入同一实例上同步的任何块时,对另一个线程可见*在
synchronized(o)
块中调用o.wait()
会稍微复杂一些。wait()调用在开始等待之前释放锁,然后在返回前重新获取锁
从技术上讲,任何数量的线程都可以在同一个实例的
synchronized(o)
块中“等待”o
,只要这些线程中只有一个在o.wait()
调用中等待,但我更愿意说,只有一个线程可以在同步块中执行,而且“等待”不算作“执行”是的,他们可以。如果在采访中有人问我这个问题,我会要求在白板上查看示例代码。如上所述,这个问题可以用不止一种方式来解释。顺便说一句,我首先要指出,“同步方法”对于一个主体是同步块的方法来说,实际上只是一种语法糖。然后,我将只讨论同步块的行为,这更容易解释。