2017-06-26 12 views
0

私はスレッドの安全性を学んでおり、オンラインで検索するときに質問に対する明確な答えが見つからないようです。スレッドの外側または内側にロックしますか?

synchronized (lock) { 
    new Thread() { 
     public void run() { 
      // critical section 
     } 
    }.start(); 
} 

と、この:

new Thread() { 
    public void run() { 
     synchronized (lock) { 
      // critical section 
     } 
    } 
}.start(); 

あなたにコンテキストを与えるために、私は小さな研究室をコーディングだし、アプローチは「1である。この違いや衝撃は何

リクエストごとのスレッド 'というように、メソッドが呼び出されるたびに、上記のいずれかが実行され、'クリティカルセクション 'が自身のスレッドで実行されます。

スレッドの内側か外側にロックがあると影響がありますか?各スレッドはロックを継承しますか、それとも完全にスレッドセーフであるためには各スレッド内になければなりませんか?

+3

最初のものは役に立たない。 – shmosel

+1

'thread.start'の後の最初のリリースロック、' runメソッド 'のすべてのコードを待つことが正しいことはロックを解除する前に終了します – Jerry06

+0

素晴らしい!ありがとう:) – JulioQc

答えて

1

同期だけ一度に一つのスレッドは、新しいスレッドを作成して開始することができる時には、第1の実施例の一つだけスレッドをコード

の特定の部分を実行することができることを意味します。しかし、あなたはクリティカルセクションを保護されていない通知が第二の例では

synchronized (lock) { 
    new Thread() { 
     public void run() { 
      // critical section 
     } 
    }.start(); 
} 

(複数のスレッドが同時にその「実行」メソッドを実行することができます)、複数のスレッドを作成し、新しいスレッドを開始しますが、1つのだけのスレッドができ(ロックで保護されている)クリティカルセクションを実行できる

new Thread() { 
    public void run() { 
     synchronized (lock) { 
      // critical section 
     } 
    } 
}.start(); 
+0

詳細な説明については、あなたは答えを得る:) – JulioQc

関連する問題