使用同步方法而不是同步块是否有优势?

任何人都可以通过示例告诉我同步方法相对于同步块的优势吗?


答案 1

任何人都可以通过示例告诉我同步方法相对于同步块的优势吗?谢谢。

与块相比,使用同步方法没有明显的优势。

也许唯一的一个(但我不会称之为优势)是你不需要包含对象引用。this

方法:

public synchronized void method() { // blocks "this" from here.... 
    ...
    ...
    ...
} // to here

块:

public void method() { 
    synchronized( this ) { // blocks "this" from here .... 
        ....
        ....
        ....
    }  // to here...
}

看?根本没有优势。

与方法相比,块确实具有优势,主要是在灵活性方面,因为您可以使用另一个对象作为锁定,而同步方法将锁定整个对象。

比较:

// locks the whole object
... 
private synchronized void someInputRelatedWork() {
    ... 
}
private synchronized void someOutputRelatedWork() {
    ... 
}

断续器

// Using specific locks
Object inputLock = new Object();
Object outputLock = new Object();

private void someInputRelatedWork() {
    synchronized(inputLock) { 
        ... 
    } 
}
private void someOutputRelatedWork() {
    synchronized(outputLock) { 
        ... 
    }
}

此外,如果该方法增长,您仍然可以将同步部分分开:

 private void method() {
     ... code here
     ... code here
     ... code here
    synchronized( lock ) { 
        ... very few lines of code here
    }
     ... code here
     ... code here
     ... code here
     ... code here
}

答案 2

唯一真正的区别是,同步块可以选择它在哪个对象上进行同步。同步方法只能使用(或同步类方法的相应类实例)。例如,它们在语义上是等效的:'this'

synchronized void foo() {
  ...
}

void foo() {
    synchronized (this) {
      ...
    }
}

后者更灵活,因为它可以竞争任何对象(通常是成员变量)的关联锁。它也更精细,因为您可以在块之前和之后执行并发代码,但仍然在方法中。当然,通过将并发代码重构为单独的非同步方法,也可以轻松使用同步方法。使用使代码更易于理解的任何一种。


推荐