2012-04-17 11 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の同期の違いスレッド

が、私はそれが排他制御のためであると考えているスレッドのためにこれらの2つのコードの違いを理解しないが、私は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

答えて

3

唯一の違いは、パフォーマンスを大幅に向上させることができるロックによって保護される操作の数を減らすことです。

例:入力時に大きな数の要素の配列を与えるサーブレットがあり、サーブレットの起動頻度をカウントするとします。問題は、変数の状態へのアクセスを同期する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例だろうしかし、質問には*どんな*操作も表示されていないので、大丈夫です。 –

0

違いは、相互排除の細分性です。上記のコードでは、一度に1つのスレッドしかMethod1を呼び出すことができません。複数のスレッドが潜在的にmyFunctionを呼び出すことができます。しかし、myFunctionは 'this'で同期化されたブロックを入力する以外に何もしないので、実際的な違いはありません。しかし、myFunctionには、複数のスレッドによって同時に実行できる同期ガード外の他のコードが含まれる可能性があります。

0

ロックの観点から見ると、両方とも同じように動作します。唯一の違いは、同期化されたブロック に使用されるnull以外のオブジェクトが存在することです。

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 ; 
    } 
} 

をお持ちの場合はそれがより高度に同時実行アプリケーションの場合

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を2つのメソッドに分割し、メソッドレベルでsynchronizedを適用することはできますが、それは時々悪いコードにつながる可能性があります。

したがって、両方の機能がJavaによって提供されています。あなたがメソッドを同期するとき

0

  • 違いを参照してください、この方法は、暗黙的にこのオブジェクトによってロックされている、あなたはすべてがロックすることが重要ではないかもしれないにもかかわらず、全体の方法をロック。 (性能低下)。

  • ブロックを同期させるときに、ロック(クリティカルな改善)のクリティカルコードを選択してロックオブジェクトを選択できます。 [複数のオブジェクトが重要なアクションを実行している、たとえば予約可能な座席を予約していて、予約のリクエストが複数あるとします。あなたは誰もが同時に予約することも許可しないかもしれないし、これ(現在のオブジェクト)をロックしたくないかもしれません。このシナリオでは、ロックを取って操作を実行する共通オブジェクトが必要です。一度に、どのオブジェクトでもロックを取得できます。したがって、一度に1つのリクエスターブックチケットしか保証されません。したがって、重複予約は許可されません]。