假设我在某个线程中执行一个synchronized
代码块,在synchronized
block 中我调用了一个方法来生成另一个线程来处理一个同步代码块这需要与第一种方法相同的锁。所以在伪 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
的实例时,返回语句运行之前的代码在什么样的范围内?它是否作为第一个同步块(synchronized block)的一部分执行?假设还有一些其他线程也在工作,可能需要锁定 lock_obj
。
最佳答案
在创建 runnable 和线程期间,您仍然持有锁,但在您调用 start 之后和线程实际启动之前,您将放弃锁。新线程将不得不与其他线程竞争锁。
关于Java 线程和同步块(synchronized block),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5295065/