1.基本属性
1.1 lock
- 1.类型:lock是Java中的一个接口,提供了比synchronized更灵活的锁机制。
- 2.加锁方式:lock是非阻塞式加锁,它支持可中断式加锁以及超时时间的加锁。这意味着当一个线程尝试获取锁时,如果锁已被其他线程持有,该线程可以选择等待、超时或者中断自己的等待。
1.2 synchronized
- 1.类型:synchronized是Java中的一个关键字,用于实现线程同步。
- 2.加锁方式:synchronized是阻塞式加锁。当一个线程持有锁时,其他尝试获取该锁的线程将被阻塞,直到持有锁的线程释放锁。
2.使用方式
2.1 lock
- 1.显式加锁:使用lock需要显式地调用lock()方法来获取锁,并在使用完毕后调用 unlock()方法 来释放锁。
- 2.多个等待队列:lock可以有多个等待队列,这允许更复杂的同步机制的实现。
- 3.Condition接口:lock提供了Condition接口,用于线程间的通信和协调,它比Object类的wait和notify方法提供了更丰富的功能。
2.2 synchronized
- 1.隐式加锁:使用synchronized时,锁的获取和释放是隐式的。当线程进入synchronized修饰的方法或代码块时,会自动获取锁;当线程退出方法或代码块时,会自动释放锁。
- 2.单个同步队列和等待队列:synchronized在进行加锁和解锁时,只有一个同步队列和一个等待队列。
- 3.wait和notify方法:synchronized使用了Object类的wait和notify方法进行等待和唤醒。
3.功能特性
3.1 lock
- 1.公平性:lock可以创建公平锁或非公平锁。公平锁意味着锁的获取顺序是按照线程请求锁的顺序来决定的,而非公平锁则可能允许插队。
- 2.可中断性:lock支持可中断的锁获取尝试,这允许线程在等待锁时可以被中断。
- 3.超时获取锁:lock允许线程尝试在指定的时间内获取锁,如果超时则获取失败。
3.2 synchronized
- 1.原子性:synchronized确保线程互斥地访问同步代码,从而保证了操作的原子性。
- 2.可见性:synchronized通过锁机制保证了共享变量的修改能够及时可见。
- 3.有序性:synchronized还解决了重排序问题,确保了线程执行的有序性。