2016-10-23 3 views
0

Javaの揮発性宣言に関するこのチュートリアル(link)では、揮発性宣言を同期化の代替手段とすることができます。揮発性宣言の代替としての同期

揮発性宣言の使用の著者の一例は:

volatile boolean shutdownRequested; 

... 

public void shutdown() { shutdownRequested = true; } 

public void doWork() { 
    while (!shutdownRequested) { 
     // do stuff 
    } 
} 

同期の私の素朴な実装は次のようになります。

volatile boolean shutdownRequested; 

... 

synchronized public void shutdown() { shutdownRequested = true; } 

synchronized public void doWork() { 
    while (!shutdownRequested) { 
     // do stuff 
    } 
} 

それは、スレッドBが既に有している場合、スレッドAがshutdown呼び出すようです呼び出され、実行されているdoWorkループであるため、スレッドBは実行を継続的にロックするように見えます。これはスレッドAがブール値にアクセスする機会を与えないようです。揮発性宣言と同期した代替案として、著者は何を思いついたのですか?

+0

記事は、一般的には、 'volatile'ではないと言って、適切な形式的なロックの代わりを開始します。 –

+0

はい、この質問は、揮発性宣言を使用する代わりにロックを使用する方法についてです。 – H2ONaCl

答えて

1

// do stuffの部分は同期ブロックの外にあります。たとえば、doWorkが同期されていて、while (!shutdownRequested)を持つのではなく、while (!getShutDown())となる場合があります。getShutDownは​​を返す同期メソッドです。ここで

0

はそれが仕事ができる一つの方法です:

public void doWork() { 
    while (true) { 
     synchronized (this) { 
      if (shutdownRequested) { 
       break; 
      } 
     } 
     // do stuff 
    } 
} 
関連する問題