2017-05-01 7 views
0

実行中のスレッドがあります。私はそれからロックを取得したい。私は明示的にそれをやりたいと思っています。メソッドのシグニチャーなどではありません。どうしたらいいですか?私のスレッドは、一度に複数のロックを取得し、ロックを取得するためにsynchronized(lock)またはメソッドのシグネチャを使用する必要があることを意味します。私はCurrentThread.acquireTheLock(lock);のようなものでなければならないと思います。そして私は書くことができるでしょうスレッドから明示的にロックを取得します。

CurrentThread.acquireTheLock(lock1); 
CurrentThread.acquireTheLock(lock2); 
+1

「ロックを取得したい」とは言わないでください。「ロックを取得したい」とは言わないでください。 IMOは、スレッドについての理由を判断する最善の方法です。スレッドは物事を遂行するアクターであり、メソッドは単に何をすべきかを指示する命令に過ぎないと想像してください。 –

+0

ロックの代わりにセマフォを使用できます。 –

答えて

0

ReentrantLockを使用することができます。

ReentrantLock lock1 = new ReentrantLock(); 
ReentrantLock lock2 = new ReentrantLock(); 

public void DoSomething() 
{ 
    lock1.lock(); 
    lock2.lock(); 
    try { 
     //critical section 
    } finally { 
     lock1.unlock(); 
     lock2.unlock(); 
    }  
} 
+0

Thread1がすでに 'lock.lock();'と呼ばれ、 'lock.unlock();'を呼び出さなかった場合、Thread2は 'lock.lock();'を呼び出します。Thread2は何もせず、 lock.unlock(); 'を実行した後、Thread2はその実行を続けます。私はそれを正しく得たか? –

+0

はい、それは正しいです。これは、lock.lock()がしばらくスレッドの実行をブロックできることを意味します。 –

関連する問題