假设我正在某个线程内执行synchronized
代码块,并且在synchronized
块内我调用一个方法来生成另一个线程来处理需要相同锁定的同步代码块第一种方法。所以在伪Java代码中:
public void someMethod() {
synchronized(lock_obj) {
// a whole bunch of stuff...
// this is the last statement in the block
(new Thread(someOtherMethod())).start();
}
// some more code that doesn't require a lock
}
public void someOtherMethod() {
// some setup code that doesn't require a lock
// return the stuff we want to run in another thread
// that does require a lock
return new Runnable() {
@Override
public void run() {
synchronized(lock_obj) {
// some more code
}
}
};
}
我不知道如何理解该代码。我写的甚至是合法的吗?从语法上讲,我没有看到任何问题,但我不确定如何通过这样的代码推理。因此,当我执行someOtherMethod()
以创建Runnable
的实例时,返回语句之前的代码在什么样的范围内运行?它是作为第一个同步块的一部分执行的吗?假设还有一些其他线程可能需要锁定lock_obj
。
答案 0 :(得分:8)
在创建runnable和线程期间,你仍然持有锁,但是在你调用start之后和线程实际接收之前你放弃了锁。新线程必须与其他线程争夺锁定。
答案 1 :(得分:5)
这段代码没有错。在someOtherMethod()
中的return语句之前,代码在someMethod()
的synchronized块中运行。新线程启动后,它将阻止synchronized
方法中的run()
语句,直到它在lock_obj
上获得锁定(最早,只要someMethod()
退出其同步块)。
答案 2 :(得分:-2)
如果首先调用someMethod(),那么它就是死锁的典型例子。
我写的甚至是合法的吗?
----是的,它在语法上是完全合法的。
所以当我执行someOtherMethod()以便在返回语句运行之前的代码的哪个范围内创建Runnable实例时? ----如果从someMethod()中调用someOtherMethod(),则调用someMethod()方法的synchronized块的范围。