理解synchronized对象锁
2013年04月18日


深入 Java虚拟机层面 去理解:


在java虚拟机中,每个对象在逻辑上都是和一个监视器相关联的。 

对于对象来说,相关联的监视器保护对象的实例变量。 

对于类来说,监视器保护类的类变量。 


如果一个对象没有实例变量,或者一个类没有变量,相关联的监视器就什么也不监视。) 

为了实现监视器的排他性监视能力,java虚拟机为每一个对象和类都关联一个锁。代表任何时候只允许一个线程拥有的特权。线程访问实例变量或者类变量不需锁。 


但是如果线程获取了锁,那么在它释放这个锁之前,就没有其他线程可以获取同样数据的锁了。(锁住一个对象就是获取对象相关联的监视器) 


类锁实际上是用对象锁来实现的当虚拟机装载一个class文件的时候,它就会创建一个java.lang.Class类的实例当锁住一个对象的时候,实际上锁住的是那个类的Class对象。 


一个线程可以多次对同一个对象上锁。对于每一个对象,java虚拟机维护一个加锁计数器,线程每获得一次该对象,计数器就加1,每释放一次,计数器就减 1,当计数器值为0时,锁就被完全释放了。(在执行wait、notify、notifyall的时候,需要有一个与之关联的集合来保存这个对象的锁被lock了几次,unlock了几次,满足如可重入锁的需求) 


从中我们可以领悟到,只有对象才有锁,基本类型、方法、代码块什么的,实际上都没有锁。JAVA中,所有的对象都是继承自Object,Object与锁机制有一定的关联。在设计可同步的变量、方法等时,首先要考虑到的是:需要寻找一个对象与之关联,找到一个合适的对象,那就对了。