锁是计算机的一个术语,“锁”是一种思想,但是不同领域有不同的实现方式。对于Java中的线程同步来说,锁有两种:一、对象锁 ; 二、类锁;
对象锁作用于类中的非静态同步方法,对非同步方法没任何作用。
在Java平台内部,会为每个对象分配一个对象锁。锁有两种状态 开着的(锁属于对象),锁上(锁属于线程)
Java平台实现方法同步原则如下:
1、当一个线程要通过一个对象引用调用同步方法时候,线程会向Java平台申请锁;锁如果开着的,Java平台锁上这个对象锁,线程获得对象锁。
2、如果对象锁是锁着的,那么申请对象锁的线程需要等有对象锁的线程打开对象锁
3、在线程获得了对象锁后,Java平台就允许线程以一个对象引用去访问对象实例范围内的任何同步方法
4、线程执行完毕同步方法后,必须归还对象锁,也即打开对象锁供其他线程使用。
5、当对象锁打开后,Java平台将是否有线程等待对象锁,有就将对象锁锁上给这个线程。然后唤醒线程继续执行。如果没有对象锁归还对象实体。
对于类锁和对象锁唯一不同的是有静态同步方法的类才有一个类锁。处理流程和对象锁一样。