猿问

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

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

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



红颜莎娜
浏览 478回答 3
3回答

一只萌萌小番薯

有人能通过一个例子告诉我同步方法相对于同步块的优势吗?谢谢。在块上使用同步方法没有明显的优势。也许唯一的一个(但我不认为它是一个优势)是您不需要包含对象引用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}

芜湖不芜

唯一真正的区别是同步块可以选择它在哪个对象上进行同步。同步方法只能使用'this'(或同步类方法的相应类实例)。例如,它们在语义上是等价的:synchronized void foo() {   ...}void foo() {     synchronized (this) {       ...     }}后者更灵活,因为它可以竞争任何对象,通常是成员变量。它也更细化,因为您可以让并发代码在块之前和之后执行,但仍然在方法中执行。当然,通过将并发代码重构为单独的非同步方法,您也可以轻松地使用同步方法。使用任何使代码更容易理解的方法。

蛊毒传说

同步法优点:IDE可以指示同步方法。语法更加简洁。强制将同步块拆分为单独的方法。缺点:同步到这一点,从而使局外人也有可能同步到它。将代码移出同步块的难度更大。同步块优点:允许对锁使用私有变量,从而迫使锁留在类中。通过搜索对变量的引用可以找到同步块。缺点:语法更复杂,因此代码更难阅读。就我个人而言,比起需要同步的东西,我更喜欢使用只关注于类的同步方法。这样的类应该尽可能小,因此检查同步应该很容易。其他人不需要关心同步。
随时随地看视频慕课网APP

相关分类

Java
我要回答