synchronized关键字能作用的范围有类,方法,静态方法,代码块。
1.类锁和静态方法锁,锁的都是类。
2.方法,和代码块锁锁的都是类的对象。
相当于锁的有两个种类,一种是对象锁,一种是类锁。
关于“实例锁”和“全局锁”有一个很形象的例子:
pulbic class Something {
public synchronized void isSyncA(){}
public synchronized void isSyncB(){}
public static synchronized void cSyncA(){}
public static synchronized void cSyncB(){}
}
假设,Something有两个实例x和y。分析下面4组表达式获取的锁的情况:
- x.isSyncA()与x.isSyncB() -不能被同时访问。因为isSyncA()和isSyncB()都是访问同一个对象(对象x)的同步锁!
- x.isSyncA()与y.isSyncA()-可以同时被访问。因为访问的不是同一个对象的同步锁,x.isSyncA()访问的是x的同步锁,而y.isSyncA()访问的是y的同步锁。
- x.cSyncA()与y.cSyncB()-不能被同时访问。因为cSyncA()和cSyncB()都是static类型,x.cSyncA()相当于Something.isSyncA(),y.cSyncB()相当于Something.isSyncB(),因此它们共用一个同步锁,不能被同时反问。
- x.isSyncA()与Something.cSyncA()-可以被同时访问。因为isSyncA()是实例方法,x.isSyncA()使用的是对象x的锁;而cSyncA()是静态方法,Something.cSyncA()可以理解对使用的是“类的锁”。因此,它们是可以被同时访问的。