对象锁对象锁:谁拿到这个对象的锁,就可以执行这个对象里的synchronized 方法,其他没拿到锁的线程被阻塞,要等待别人执行完后交出锁,再去争取;对象锁只对synchronized 方法起作用,非synchronized 方法不受影响,仍然可以访问比如 class A { public synchronized void f() { } public synchronized void g() { } }A a = new A(); A b = new A();当一个线程正在调用 a.f()时,其他线程此时就无法调用 a.f()和a.g()及A中其他synchronized 方法,会被阻塞,直到a.f()调用完成后,才交出对象a的锁; 但此时可以通过另一个对象b来调用f()或g() 对象a的调用不会影响对象b的调用 所以锁住的是对象 当然如果不是synchronized 方法就不受这个限制 另外:类中的static方法是属于"类锁"(具体怎么个称呼忘了) 如果上诉的f()方法为static,则 调用a.f()时,其他线程调用b.f()也会被阻塞 因为此时a.f()和b.f()其实调用的是同一个方法 我这样解释 不知道你清楚不
class A
{
public synchronized void f()
{
} public synchronized void g()
{
}
}A a = new A();
A b = new A();当一个线程正在调用 a.f()时,其他线程此时就无法调用 a.f()和a.g()及A中其他synchronized 方法,会被阻塞,直到a.f()调用完成后,才交出对象a的锁;
但此时可以通过另一个对象b来调用f()或g()
对象a的调用不会影响对象b的调用
所以锁住的是对象
当然如果不是synchronized 方法就不受这个限制
另外:类中的static方法是属于"类锁"(具体怎么个称呼忘了)
如果上诉的f()方法为static,则 调用a.f()时,其他线程调用b.f()也会被阻塞
因为此时a.f()和b.f()其实调用的是同一个方法
我这样解释
不知道你清楚不