Synchronized statements are also useful for improving concurrency with fine-grained synchronization.
Suppose:
Instead of using synchronized methods or otherwise using the lock associated with this, we create two objects solely to provide locks.
public class MsLunch {
// two instance fields, c1 and c2
private long c1 = 0;
private long c2 = 0;
// two objects solely to provide locks
private Object lock1 = new Object();
private Object lock2 = new Object();
public void inc1() {
synchronized(lock1) {
c1++;
}
}
public void inc2() {
synchronized(lock2) {
c2++;
}
}
}