锁对象lock是指对象所指向的内存地址
第一条:当一个线程访问某对象的synchronized方法或者synchronized代码块时,其他线程对该对象的该synchronized方法或者synchronized代码块的访问将被阻塞。
第二条:当一个线程访问某对象的synchronized方法或者synchronized代码块时,其他线程仍然可以访问该对象的非同步代码块。
第三条:当一个线程访问某对象的synchronized方法或者synchronized代码块时,其他线程对该对象的其他的synchronized方法或者synchronized代码块的访问将被阻塞。
关于实例锁和全局锁有个很好的例子。
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组表达式获取锁的情况。
(01) x.isSyncA()与x.isSyncB()//不能同时访问两个都是用x当做锁
(02) x.isSyncA()与y.isSyncA()//可以同时访问,因为两个锁不同
(03) x.cSyncA()与y.cSyncB()//不可以被同时访问,他们使用的都是Something作为锁
(04) x.isSyncA()与Something.cSyncA()//可以被同时访问
参考文章:
https://blog.csdn.net/wanliguodu/article/details/81005560