David K.
David K.

Reputation: 6361

Java threads and synchronized blocks

Suppose I'm executing a synchronized block of code inside some thread and within the synchronized block I call a method that spawns another thread to process a synchronized block of code that requires the same lock as the first method. So in pseudo Java code:

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
      }
    }
  };
}

I have no idea how to make sense of that code. Is what I have written even legal? Syntactically I don't see any issues but I'm not sure how to reason through code like that. So when I execute someOtherMethod() in order to create an instance of Runnable in what kind of scope does the code before the return statement run? Does it execute as part of the first synchronized block? Assume there are some other threads working as well that might require the lock on lock_obj.

Upvotes: 9

Views: 3106

Answers (3)

Amit
Amit

Reputation: 465

If someMethod() is invoked first, its the classical example of a deadlock.

Is what I have written even legal?
---- Yes it is perfectly legal syntactically.

So when I execute someOtherMethod() in order to create an instance of Runnable in what kind of scope does the code before the return statement run? ----If the someOtherMethod() is invoked from within someMethod() then its in scope of the synchronized block of the someMethod() method.

Upvotes: -2

Ted Hopp
Ted Hopp

Reputation: 234795

There's nothing wrong about this code. Before the return statement in someOtherMethod(), the code is running in the synchronized block of someMethod(). After the new thread starts, it will block on the synchronized statement inside the run() method until it obtains a lock on lock_obj (at the earliest, whenever someMethod() exits its synchronized block).

Upvotes: 7

Konstantin Komissarchik
Konstantin Komissarchik

Reputation: 29139

You are still holding the lock during the creation of runnable and the thread, but after you call start and before the thread actually picks up you are relinquishing the lock. The new thread will have to compete for the lock with other threads.

Upvotes: 10

Related Questions