2012-04-17 75 views
0

可能重複:
What is the difference between a synchronized method and synchronized block in Java?
What is the difference between a synchronized function and synchronized block?的Java同步差異線程

我不明白的線程這兩個代碼之間的區別,我相信這是一個互相排斥,但我不understqnd你能幫助我什麼?

public synchronized void Method1() { 
    } 

public myFunction(){ 
     synchronized (this) { 
    } 
} 

感謝您的幫助。

+1

或http://stackoverflow.com/questions/1149928/what-is-the-difference-between-a-synchronized-method-and-synchronized-block-in-j – bdonlan 2012-04-17 06:00:17

回答

3

唯一的區別是減少了一些可以提高性能的鎖操作。

例子:讓我們想象一下,我們有一個servlet這給上輸入一個大數目一系列因素,我們要算的servlet是如何頻繁啓動。問題是同步進入狀態變量requestsCount

//Poor performance 
class PoorFactorizer implements Servlet { 
    private int requestsCount = 0; 
    public synchronized void service(ServletRequest req, ServletResponse res) { 
     BigInteger numberToFactorize = extractFromRequest(req); 
     BigInteger[] factors = factorize(numberToFactorize); // long lasting 
           // operation makes everyone wait 
     requestCount++; 
     encodeResponse(res, factors); 
    } 
} 

//Better perfomance 
class PoorFactorizer implements Servlet { 
    private int requestsCount = 0; 
    public void service(ServletRequest req, ServletResponse res) { 
     BigInteger numberToFactorize = extractFromRequest(req); 
     BigInteger[] factors = factorize(numberToFactorize); 
     // since we need to guard only the class' state 
     // let's guard only the operation with the state 
     synchronized(this) {    
      requestCount++; 
     } 
     encodeResponse(res, factors); 
    } 
} 

UPD:你可以閱讀的傑作的「Java併發編程實踐」一個很好的解釋(第2章)。我強烈建議您從封面閱讀本書。

+1

1的例子將不過,因爲這個問題沒有顯示任何操作。 – 2012-04-17 06:25:34

0

區別在於互斥的粒度。使用上面的代碼,一次只有一個線程可以調用Method1;多個線程可能會調用myFunction。但是,由於myFunction除了輸入一個在'this'上同步的塊之外什麼都沒做,所以沒有實際的區別。但是,myFunction可能會包含同步警衛之外的其他代碼,這些代碼可以由多個線程同時執行。

0

從鎖定角度來看,兩者表現相同。唯一的區別是可以有任何非空對象用於同步塊 即。

public myFunction(){ 
    synchronized (anyObject) { 
} 
} 

現在可以基於此對象同步該塊。

凡作爲其中使用synchronized關鍵字的情況下,它的同步範圍取決於調用對象上。

希望這對你有所幫助。享受編碼!

0

如果你有一個方法

public synchronized void methodA() 
{ 
    while(condition) 
    { 
     // do Something That Takes A Minute ; 
    } 
    // do Something That Needs A Lock; 
    while(condition) 
    { 
     // do Something That Takes Another Minute ; 
    } 
} 

將持有鎖2分鐘以上

public void methodA() 
{ 
    while(condition) 
    { 
     // do Something That Takes A Minute ; 
    } 
    synchronized(this) 
    { 
     // do Something That Needs A Lock; 
    } 
    while(condition) 
    { 
     // do Something That Takes Another Minute ; 
    } 
} 

在高併發應用的情況下,在時間差爲其持有鎖非常重要。

按理說可以打破方法2分成2種方法,在方法級別應用同步,但有時可能導致惡意代碼。

這兩個設施都是由Java提供的。

0

看到區別

  • 當您同步方法,方法是隱式由該對象鎖定,鎖定你,即使一切可能不是關鍵鎖定整個方法。 (性能下降)。

  • 當你同步塊時,你已經選擇了鎖定的關鍵代碼(性能改進),你可以選擇鎖定對象。 [假設你有多個對象執行重要的操作,例如預訂座位,並且你有多個預訂請求。您可能不允許每個人同時預訂,也不希望鎖定此(當前對象)。在這種情況下,你需要有共同的對象來鎖定並執行操作。一次,Lock可以被任何一個對象獲取。因此,您一次只能保證一張請求人賬單。因此,不允許重複預訂]。