为了账号安全,请及时绑定邮箱和手机立即绑定

使用同步方法而不是同步块有好处吗?

使用同步方法而不是同步块有好处吗?

红颜莎娜 2019-06-20 16:11:00
使用同步方法而不是同步块有好处吗?有谁能通过一个例子告诉我同步方法相对于同步块的优势?
查看完整描述

3 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

有人能通过一个例子告诉我同步方法相对于同步块的优势吗?谢谢。

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

也许唯一的一个(但我不认为它是一个优势)是您不需要包含对象引用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() {
    ... }

v.V.

// Using specific locksObject 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}


查看完整回答
反对 回复 2019-06-20
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

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

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

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


查看完整回答
反对 回复 2019-06-20
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

同步法

优点:

  • IDE可以指示同步方法。
  • 语法更加简洁。
  • 强制将同步块拆分为单独的方法。

缺点:

  • 同步到这一点,从而使局外人也有可能同步到它。
  • 将代码移出同步块的难度更大。

同步块

优点:

  • 允许对锁使用私有变量,从而迫使锁留在类中。
  • 通过搜索对变量的引用可以找到同步块。

缺点:

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

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


查看完整回答
反对 回复 2019-06-20
  • 3 回答
  • 0 关注
  • 477 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信