**本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动连接 **markdown
问题: 有人能够告诉我用同步方法替代同步代码块有什么优点吗? 最好举个例子并发
------------------------------如下为回答,按支持票数排序----------------------------------ui
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
}
复制代码
惟一的不一样是同步代码块能够选择指定对象做为锁,然而同步方法只能使用this
(或同步类方法使用其对应的类实例)。例如,下面两种语义是等效的:排序
synchronized void foo() {
...
}
void foo() {
synchronized (this) {
...
}
}
复制代码
后者更灵活,由于它能够竞争任何对象(一般是成员变量)的关联锁。它也更精细,由于您能够在块以前和以后执行并发代码,但仍能够在该方法内执行。固然,经过将并发代码重构为单独的非同步方法,您也能够轻松使用同步方法。这样使用可使代码更容易理解。input