有谁能举例说明同步方法优于同步块的优势吗?
在块上使用同步方法没有明显的优势。
也许唯一的一个(但我不会称其为优势)是你不需要包括对象引用this。
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 }