使用同步方法而不是同步块有什么优点吗?

10 浏览
0 Comments

使用同步方法而不是同步块有什么优点吗?

有人能举个例子告诉我同步方法与同步块的优势吗?

admin 更改状态以发布 2023年5月22日
0
0 Comments

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

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

后者更灵活,因为它可以竞争任何对象的关联锁,通常是成员变量。它也更细粒度,因为你可以在同一个方法中有并行代码执行在块之前和之后。当然,你也可以通过将并行代码重新编写为单独的非同步方法来使用同步方法。使用这两种方法中更易于理解代码的一种。

0
0 Comments

有人能告诉我使用同步方法比使用同步块的优势并附带一个例子吗?谢谢。

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

也许唯一的优势(但我不会称之为优势)是您不需要包括对象引用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
}

0