我需要清除一些基本概念,以检查我的理解是否正确。
1) 一旦线程进入 实例上的任何 同步方法 / em> , 没有其他帖子 可以在上输入任何 其他同步方法 相同的实例 。
2) 然而, 实例上的 非同步方法 将继续可调用(由其他线程)。如果是的话,我可以说整个对象没有被锁定但只有同步的关键方法。
3)我是否也会获得与synchronized
语句相同的行为:
synchronised(this){
// statements to be synchronised
}
或整个对象在此 非同步方法 上锁定, 实例 不可调用。
我认为我对锁定范围非常困惑。
答案 0 :(得分:3)
一个锁只能阻止其他线程获取同一个锁 - 锁本身不知道它保护什么 - 它只是一个线程可以拥有的东西。我们说整个对象都被锁定了,因为任何其他尝试锁定整个对象的线程在释放之前都无法获取该锁。否则,你的理解是正确的。
答案 1 :(得分:2)
您的陈述是正确的。只有同步的代码才会受到保护。该对象仅用作同步锁,它本身并不“锁定”。
是的,您在同一对象上获得了同步块的相同行为。实际上,您可以使用另一个对象作为锁来同步一个对象的代码中的块。
答案 2 :(得分:2)
代码,
public synchronized void abc() {
...
}
它在概念上与
相同public void abc() {
synchronized(this) {
}
}
在这些情况中的任何一种情况下,当监视器(在本例中是调用方法abc的对象)被执行同步块或方法的线程锁定时,可以调用非同步方法。
答案 3 :(得分:0)
您的理解是正确的。您所做的所有三个陈述都是有效的。 请注意一件事,锁不在方法上(同步或非同步)。锁始终在对象上,一旦一个线程获得对象的锁定,其他线程必须等到锁被释放并可供其他线程获取。