I saw this in one of Heinz Kabutz's Java Specialist newsletter editions and, although the rest (and indeed, all) of Dr. Kabutz's articles are well-explained and detailed, he seemed to gloss over what this code is doing, or more importantly, what it's significance is:
public class SomeObject {
private Object lock1;
private Object lock2;
public void doSomething() {
synchronized(lock1) {
synchronized(lock2) {
// ...
}
}
}
}
What are the implications of nesting synchronized
blocks? How does this affect different threads attempting to doSomething()
?
public void doSomething() { synchronized(lock1) { synchronized(lock2) { // ... } } } public void doOtherthing() { synchronized(lock2) { synchronized(lock1) { // ... } } } now if more than one thread are trying to access these methods then there may be a deadlock because of nested synchronized blocks.
A Synchronized block is a piece of code that can be used to perform synchronization on any specific resource of the method. A Synchronized block is used to lock an object for any shared resource and the scope of a synchronized block is smaller than the synchronized method.
Nested monitor lockout is a problem similar to deadlock. A nested monitor lockout occurs like this: Thread 1 synchronizes on A Thread 1 synchronizes on B (while synchronized on A) Thread 1 decides to wait for a signal from another thread before continuing Thread 1 calls B.
There are 2 possible issues that one would have to watch out for
Nested locks can result in deadlocks quite easily if one is using wait/notify. Here is an explanation of why. http://tutorials.jenkov.com/java-concurrency/nested-monitor-lockout.html
One should be wary that if another method wishes to lock the same two objects, they must always do it in the same order, otherwise there is the possibility of another deadlock situation as explained in this post: How to avoid Nested synchronization and the resulting deadlock
On its own this code snippet won't cause any problem. But the problem may come in the form of deadlock if there is something like this code; where we have two methods with synchronized blocks in such a way that objects are locked in opposite orders-
public void doSomething() {
synchronized(lock1) {
synchronized(lock2) {
// ...
}
}
}
public void doOtherthing() {
synchronized(lock2) {
synchronized(lock1) {
// ...
}
}
}
now if more than one thread are trying to access these methods then there may be a deadlock because of nested synchronized blocks.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With