我们在使用Java多线程同步的时候需要了解很多的知识其中Java多线程同步机制实际上是靠锁的概念来控制的这个问题就需要我们引起注意那么在Java程序当中锁是如何体现的呢?
让我们从JVM的角度来看看锁这个概念
在Java程序运行时环境中JVM需要对两类线程共享的数据进行协调
)保存在堆中的实例变量
)保存在方法区中的类变量
这两类数据是被所有线程共享的(程序不需要协调保存在Java 栈当中的数据因为这些数据是属于拥有该栈的线程所私有的)
在java虚拟机中每个对象和类在逻辑上都是和一个监视器相关联的对于对象来说相关联的监视器保护对象的实例变量对于类来说监视器保护类的类变量
(如果一个对象没有实例变量或者一个类没有变量相关联的监视器就什么也不监视)
为了实现监视器的排他性监视能力java多线程同步虚拟机为每一个对象和类都关联一个锁代表任何时候只允许一个线程拥有的特权线程访问实例变量或者类变量不需锁但是如果线程获取了锁那么在它释放这个锁之前就没有其他线程可以获取同样数据的锁了(锁住一个对象就是获取对象相关联的监视器)
类锁实际上用对象锁来实现当虚拟机装载一个class文件的时候它就会创建一个javalangClass类的实例当锁住一个对象的时候实际上锁住的是那个类的Class对象
一个线程可以多次对同一个对象上锁对于每一个对象java虚拟机维护一个加锁计数器线程每获得一次该对象计数器就加每释放一次计数器就减 当计数器值为时锁就被完全释放了
java多线程同步不需要自己动手加锁对象锁是java虚拟机内部使用的在java程序中只需要使用synchronized块或者synchronized方法就可以标志一个监视区域当每次进入一个监视区域时java 虚拟机都会自动锁上对象或者类
看到这里我想你们一定都疲劳了吧?当一个有限的资源被多个线程共享的时候为了保证对共享资源的互斥访问我们一定要给他们排出一个先来后到而要做到这一点对象锁在这里起着非常重要的作用