首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Synchronized方法而不是Synchronized Block有优势吗?

使用Synchronized方法而不是Synchronized Block有优势吗?
EN

Stack Overflow用户
提问于 2009-02-22 03:13:48
回答 23查看 293.7K关注 0票数 418

谁能用一个例子告诉我synchronized方法比synchronized块的优点?

EN

回答 23

Stack Overflow用户

回答已采纳

发布于 2009-02-22 03:36:20

谁能用一个例子告诉我synchronized方法相对于synchronized块的优点?谢谢。

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

也许唯一的一个(但我不认为这是一个优点)是您不需要包含对象引用this

方法:

代码语言:javascript
复制
public synchronized void method() { // blocks "this" from here.... 
    ...
    ...
    ...
} // to here

数据块:

代码语言:javascript
复制
public void method() { 
    synchronized( this ) { // blocks "this" from here .... 
        ....
        ....
        ....
    }  // to here...
}

看见?一点优势都没有。

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

比较:

代码语言:javascript
复制
// locks the whole object
... 
private synchronized void someInputRelatedWork() {
    ... 
}
private synchronized void someOutputRelatedWork() {
    ... 
}

代码语言:javascript
复制
// Using specific locks
Object inputLock = new Object();
Object outputLock = new Object();

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

此外,如果方法增长,您仍然可以保持同步节的分离:

代码语言:javascript
复制
 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
}
票数 446
EN

Stack Overflow用户

发布于 2009-02-22 03:26:34

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

代码语言:javascript
复制
synchronized void foo() {
  ...
}

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

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

票数 143
EN

Stack Overflow用户

发布于 2009-02-22 07:31:19

同步方法

优点:

  • 您的IDE可以指示同步的方法。
  • 语法是
  • 将同步的块拆分成不同的方法。

缺点:

  • 对此进行同步,因此外部人员也可以与其同步。
  • 将代码移出synchronized块变得更加困难。

同步块

优点:

  • 允许对锁使用私有变量,因此可以通过搜索对该变量的引用来查找强制锁留在class.
  • Synchronized块中。

缺点:

  • 语法更复杂,因此代码更难读。

就我个人而言,我更喜欢使用同步方法,其中的类只专注于需要同步的东西。这样的类应该尽可能小,因此应该很容易检查同步。其他人不应该关心同步。

票数 78
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/574240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档