Java の同期ブロックの概念を理解しようとしています。私が読んだドキュメントの時点で、ロック(インスタンス変数を使用した同期ブロック)を取得すると、そのクラスの同じオブジェクトの同期ロックを取得できないことがわかりました。しかし、次のスニペットを実際に使用してみると、私の理解が間違っていることがわかりました。
つまり、同時に 2 つの異なるメソッドでロック (同じインスタンス変数の同期ブロック) を取得できます。スレッドが開始されると、メソッドを実行し、無期限に待機し、同期ブロックから出ることはありません。同時に、同じスレッドを使用して stop メソッドを呼び出すと、同期ブロックに入り、notify ステートメントを実行します。Java doc を検索しましたが、何も見つかりませんでした。
これはコード スニペットです。
public class MyClass extends Thread
{
private Object lock = new Object();
public void run()
{
synchronized(lock)
{
lock.wait()
}
//other code
}
public void stop()
{
synchronized(lock)
{
lock.notify()
}
//other code
}
}
MyClass スレッドの管理方法のコード スニペットを次に示します。
public class MyClassAdmin
{
MyClass _myclass;
public MyClassAdmin()
{
_myclass=new MyClass();
_myclass.start();
}
public void stop()
{
_myclass.stop();
}
public static void main(String args[])
{
MyClassAdmin _myclassAdmin=new MyClassAdmin();
_myclassAdmin.stop();
}
}
私の理解によると、スレッドが開始されると、「ロック」オブジェクト(MyClassのrunメソッドの同期ブロック)でロックが取得されます。stop メソッドを呼び出すと、run メソッドが同期ブロックから出るまで無期限に待機する必要があります (この場合は発生しません)。しかし、私が実行したとき、メソッドを停止するための呼び出しが「ロック」オブジェクトのロックを取得し、オブジェクトに通知した結果、スレッドがシャットダウンしました。