A synchronized method uses the method receiver as a lock (i.e. this
for non static methods, and the enclosing class for static methods). Synchronized
blocks uses the expression as a lock.
So the following two methods are equivalent from locking prospective:
synchronized void mymethod() { ... }
void mymethod() {
synchronized (this) { ... }
}
For static methods, the class will be locked:
class MyClass {
synchronized static mystatic() { ... }
static mystaticeq() {
syncrhonized (MyClass.class) { ... }
}
}
For synchronized blocks, you can use any non-null
object as a lock:
synchronized (mymap) {
mymap.put(..., ...);
}
Lock scope
For synchronized methods, the lock will be held throughout the method scope, while in the synchronized
method, the lock is held only during the synchronized
block (otherwise known as critical section). In practice, the JVM is permitted to optimize by removing some operations out of the synchronized
block execution if it can prove that it can be done safely.