我试图理解java中同步块的概念。根据我阅读的文档,我了解到如果我们获取锁(使用实例变量的同步块),那么我们无法在该类中的同一对象上获取同步锁。但是当我实际尝试使用以下代码段时,我发现我的理解出错了。
即我能够同时在两种不同的方法中获取锁(同一实例变量上的同步块)。当线程启动时,它将进入 run 方法并无限期地等待,并且不会退出同步块。同时,如果我使用同一个线程调用 stop 方法,它会进入同步块并执行通知语句。我在 Java 文档中进行了搜索,但找不到任何内容。
这是代码片段:
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 的运行方法中的同步块)。当我调用 stop 方法时,它应该无限期地等待,直到 run 方法从同步块中出来(在这种情况下永远不会发生)。但是当我执行时,调用停止方法获取了“锁”对象上的锁并通知了导致线程关闭的对象。