Java对象锁和类锁是两种不同的锁机制,具有不同的作用和使用方式。
-
Java对象锁:也称为实例锁,是针对对象实例的锁。每个对象实例都有一个对应的对象锁,用于控制对该对象实例的并发访问。当一个线程获取了对象的锁后,其他线程必须等待该线程释放锁才能获取锁。对象锁的使用方式有两种:
- synchronized关键字:可以用于方法和代码块,对于同步方法,锁定的是当前对象实例;对于同步代码块,可以指定锁定的对象。
- Lock接口:可通过Lock对象的lock()和unlock()方法对锁进行显式控制。
-
类锁:也称为静态锁,是针对类的锁。类锁是用来控制对类的静态成员的并发访问。当一个线程获取了类的锁后,其他线程必须等待该线程释放锁才能获取锁。类锁的使用方式有两种:
- synchronized关键字:可以用于静态方法和代码块,对于同步静态方法,锁定的是当前类;对于同步静态代码块,可以指定锁定的类。
- Lock接口:可通过Lock对象的lock()和unlock()方法对锁进行显式控制。
区别:
- 锁定的范围不同:对象锁是针对对象实例的,并发访问同一个对象实例时会被锁住;而类锁是针对类的,并发访问同一个类的静态成员时会被锁住。
- 锁定的对象不同:对象锁锁定的是对象实例,不同的对象实例之间互不影响;类锁锁定的是类本身,所有对象实例共享同一把锁。
- 锁定的粒度不同:对象锁可以实现更细粒度的锁定,不同的对象实例之间可以并发访问;类锁是全局的锁定,所有的对象实例需要等待同一把锁释放。
总之,对象锁和类锁分别用于控制对象实例和类的并发访问,根据实际需求选择合适的锁机制。