使用同步方法替代同步代码块是否有优点|Java Debug 笔记

**本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动连接 **markdown

问题: 有人能够告诉我用同步方法替代同步代码块有什么优点吗? 最好举个例子并发

------------------------------如下为回答,按支持票数排序----------------------------------ui

回答1(支持票数442):
Can anyone tell me the advantage of the synchronized method over the synchronized block with an example? Thanks.
复制代码

使用同步方法替换同步代码块并无明显的优点。 也许有一个(可是我并不认为是一个优点)就是你不须要再加上对象引用this。 同步方法:this

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

同步代码块:spa

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

看见了吗?根本没有优点。code

可是,块确实比方法具备优点,主要是在灵活性上,由于您能够将另外一个对象用做锁,而同步该方法将锁定整个对象。 比较如下两块代码:orm

// 锁住整个对象
... 
private synchronized void someInputRelatedWork() {
    ... 
}
private synchronized void someOutputRelatedWork() {
    ... 
}
复制代码
// 使用指定的对象锁
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(支持票数142):

惟一的不一样是同步代码块能够选择指定对象做为锁,然而同步方法只能使用this(或同步类方法使用其对应的类实例)。例如,下面两种语义是等效的:排序

synchronized void foo() {
  ...
}

void foo() {
    synchronized (this) {
      ...
    }
}
复制代码

后者更灵活,由于它能够竞争任何对象(一般是成员变量)的关联锁。它也更精细,由于您能够在块以前和以后执行并发代码,但仍能够在该方法内执行。固然,经过将并发代码重构为单独的非同步方法,您也能够轻松使用同步方法。这样使用可使代码更容易理解。input

相关文章
相关标签/搜索