线程中的静态同步和非静态同步方法

sat*_*esh 8 java multithreading

可以任何人解释声明......"静态同步方法和非静态同步方法不会相互阻塞 - 它们可以同时运行"

ata*_*man 17

static synchronized void test() { foo(); }
Run Code Online (Sandbox Code Playgroud)

等于

static void test() { synchronized(MyClass.class) { foo(); } }
Run Code Online (Sandbox Code Playgroud)

synchronized void test() { foo(); }
Run Code Online (Sandbox Code Playgroud)

等于

void test() { synchronized(this) { foo(); } }
Run Code Online (Sandbox Code Playgroud)

这意味着:静态方法锁定类的类对象.非静态方法锁定它们被调用的实例(默认情况下synchronized(anyOtherLock)也是如此).由于它们锁定不同的对象,因此它们不会相互阻挡.


Chr*_*ett 9

静态方法和非静态方法上的锁定对象是不同的.静态方法使用Class对象作为锁(lock obj :) MyClass.class,而非静态方法使用实例对象作为锁定,此时方法的调用被绑定到该锁(lock obj :) this.