2016-03-18 12 views
0

機能myFunc()を複数のスレッドから実行することを隔離する必要があります。私はMutexでこのタスクを解決する方法を知っています。 Java 1.4はサポートしていないので、別の方法でこのタスクを解決する方法はMutexですか?Java 1.4のミューテックス

+3

私は同期の方法に比べて、最終的なオブジェクトのロックを好む – mks

答えて

1

Javaでは、すべてのオブジェクトに固有のロックがあります。これはモニターロックとも呼ばれます。これは簡単な相互排除を提供するのには十分ですが、それには限界があります。

public final class MyClass1 { 
    public synchronized void myFunc() { 
     // Exclusive work here 
    } 
} 

法上の​​キーワードは、myFuncというを実行する前にMyClass1オブジェクトインスタンスの固有ロックを取得しなければならないことを意味しています。

public static final class MyClass2 { 
    private final Object mutex = new Object(); 
    public void myFunc() { 
     synchronized (mutex) { 
      // Exclusive work here 
     } 
     // There is no mutual exclusion here 
    } 
} 

ブロック内のブロックは、ブロックのスコープに対して同期させることができます。これにより、オブジェクトを選択してロックを取得することもできます。

組み込みロックは最終的に取得されるか、スレッドがハングします。固有のロックを取得しようとすると、タイムアウトになることはなく、中断することはできません。

固有のロックはリエントラントなので、スレッド自体がデッドロックする心配はありません。異なる順序でロックを取得すると、デッドロックが発生する可能性があります。

synchronizedキーワードを使用すると、同じオブジェクトをロックする同期コードで両方の読み取りと書き込みが行われた場合でもメモリの可視性が保証されます。

https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html https://docs.oracle.com/javase/tutorial/essential/concurrency/memconsist.html

また、現在の情報の1.4そんなには適用されませんので、Javaのメモリモデルが変更されたことを知っている必要があります。

https://www.ibm.com/developerworks/library/j-jtp03304/

+1

... Javaのバージョンをアップグレードするために最大の努力を入れてください。複数の同期メソッドがある場合、インスタンスでロックするメソッドを同期すると、問題が発生する可能性があります。 –

関連する問題