以前记得被问到一个面试题,问synchronized(obj){} 和 synchronized(xx.class){}有什么区别。当时还答的不好。
用比喻来说,java内置锁(Monitor)就像一个毛坑,第一种情况这个毛坑存在于obj中,一个对象只有一个毛坑,这个毛坑被一个线程占了那其他的线程就必须排队。但对于不用的对象,每个对象的毛坑是独立的,也就是线程1和线程2可以同时占住obj1和obj2的毛坑,这两个可以并发并不会互相排斥。
而第二种情况这个毛坑存在于Class对象中。Class对象应该就一个,所以所有线程只能一个一个地在这段同步代码块上排队,是完全排他的。
While a thread is executing a method of a thread-safe object, it is said to occupy the object, by holding its mutex (lock). Thread-safe objects are implemented to enforce that at each point in time, at most one thread may occupy the object.