Java中对象的非同步方法?

时间:2015-03-31 19:55:00

标签: java multithreading

我需要清除一些基本概念,以检查我的理解是否正确。

1) 一旦线程进入 实例上的任何 同步方法 / em> 没有其他帖子 可以在上输入任何 其他同步方法 相同的实例

2) 然而, 实例上的 非同步方法 将继续可调用(由其他线程)。如果是的话,我可以说整个对象没有被锁定但只有同步的关键方法。

3)我是否也会获得与synchronized语句相同的行为:

synchronised(this){

     // statements to be synchronised  
}

或整个对象在此 非同步方法 上锁定, 实例 不可调用。

我认为我对锁定范围非常困惑。

4 个答案:

答案 0 :(得分:3)

一个锁只能阻止其他线程获取同一个锁 - 锁本身不知道它保护什么 - 它只是一个线程可以拥有的东西。我们说整个对象都被锁定了,因为任何其他尝试锁定整个对象的线程在释放之前都无法获取该锁。否则,你的理解是正确的。

答案 1 :(得分:2)

您的陈述是正确的。只有同步的代码才会受到保护。该对象仅用作同步锁,它本身并不“锁定”。

是的,您在同一对象上获得了同步块的相同行为。实际上,您可以使用另一个对象作为锁来同步一个对象的代码中的块。

答案 2 :(得分:2)

代码,

public synchronized void abc() {
...
}

它在概念上与

相同
public void abc() {
    synchronized(this) {
    }
}

在这些情况中的任何一种情况下,当监视器(在本例中是调用方法abc的对象)被执行同步块或方法的线程锁定时,可以调用非同步方法。

答案 3 :(得分:0)

您的理解是正确的。您所做的所有三个陈述都是有效的。 请注意一件事,锁不在方法上(同步或非同步)。锁始终在对象上,一旦一个线程获得对象的锁定,其他线程必须等到锁被释放并可供其他线程获取。