同步方法
静态方法
在静态方法上使用synchronized关键字进行同步,使用的是class锁。
普通方法
在普通方法上使用synchronized关键字进行的同步,使用的是class实例的对象锁。
类似 obj.methodX()的调用,前提是thread已经拿到obj的对象锁(methodX是非静态同步方法)。
举例
如果一个线程正在访问一个synchronized静态方法A,那么其他线程不能访问这个class中所有的synchronized静态方法。
但是其他线程可以访问此class实例中的非静态synchronized方法。
public class DemoSynchronized{
public static synchronized void methodA{}
public static synchronized void methodB{}
public synchronized void methodC{}
public synchronized void methodD{}
}
以上, 如果有一个线程正在访问methodA, 那么其他线程既不能访问methodA,也不能访问methodB;
但是,其他线程可以访问DemoSynchronized 实例的methodC和methodD方法。
同步块
相对于同步方法,同步块的粒度更小,相对来说效率更高。