java静态同步方法
当两个线程同时使用不同的实例调用静态同步方法时会发生什么? 可能吗? 对象锁用于非静态同步方法,但是什么类型的锁用于静态同步方法?
它与实现该方法的Class
对象上的同步相同,所以是的,它是可能的,并且是的,该机制有效地忽略了调用该方法的实例:
class Foo { private static synchronized doSomething() { // Synchronized code } }
是写这个的快捷方式:
class Foo { private static doSomething() { synchronized(Foo.class) { // Synchronized code } } }
有可能的。
线程锁定Class
对象,就像在MyClass.class
。
见JLS,第8.4.3.6节。 同步方法 :
8.4.3.6。 同步方法
同步方法在执行之前获取监视器(第17.1节)。
对于类(静态)方法,使用与方法类的Class对象关联的监视器。
静态同步方法在java.lang.Class类型的实例上使用锁。 也就是说,每个可访问类在运行时由类型为Class的对象表示,该对象由静态同步方法使用。
使用静态锁定时,将忽略对象。 锁是在类而不是对象上获取的。