Java线程和同步块

dav*_*k01 9 java concurrency multithreading deadlock synchronized

假设我正在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
      }
    }
  };
}
Run Code Online (Sandbox Code Playgroud)

我不知道如何理解该代码.我写的甚至是合法的吗?从语法上讲,我没有看到任何问题,但我不确定如何通过这样的代码推理.那么当我执行someOtherMethod()以便Runnable在返回语句运行之前创建一个在什么样的范围内的代码的实例?它是作为第一个同步块的一部分执行的吗?假设还有一些其他线程可能需要锁定lock_obj.

Kon*_*hik 10

在创建runnable和线程期间你仍然保持锁定,但是在你调用start之后和线程实际启动之前你放弃了锁定.新线程将不得不与其他线程争夺锁定.


Ted*_*opp 7

这段代码没有错.在返回语句之前someOtherMethod(),代码在synchronized块中运行someMethod().新线程启动后,它将阻塞方法synchronized内的语句,run()直到它获得锁定lock_obj(最早,每当someMethod()退出其synchronized块时).