一个是实例锁(锁在某一个实例对象上,如果该类是单例,那么该锁也具有全局锁的概念),
一个是全局锁(该锁针对的是类,无论实例多少个对象,那么线程都共享该锁)。
ps:对象锁与类锁互不干扰,与对象无关!
实例锁对应的就是synchronized关键字,而类锁(全局锁)对应的就是static synchronized(或者是锁在该类的class或者classloader对象上)。
注:
static 说明了该类的一个静态资源,不管new了多少个对象,只有一份,所以对该类的所有对象都加了锁!(实践才能更好的理解)
实例锁是锁特定的实例(只要有synchronized就会去锁该实例),全局锁是锁所有的实例。
synchronized是对类的当前实例(当前对象)进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块(注:是所有),注意这里是“类的当前实例”, 类的两个不同实例就没有这种约束了。
static synchronized恰好就是要控制类的所有实例的并发访问,static synchronized是限制多线程中该类的所有实例同时访问jvm中该类所对应的代码块。
也就是说synchronized相当于 this.synchronized,而static synchronized相当于Something.synchronized.
注意:synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法;