lock和synchronized区别:
1)Lock是一个接口, 而synchronized是Java中的关键字,是内置的语言实现。
2)在发生异常时,synchronized会自动释放锁,Lock必须手动调用unLock()释放锁,否则会造成死锁。因此使用Lock时需要在finally块中释放锁。
3)Lock可以让等待锁的线程响应中断,线程可以中断去干别的事务,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;
4)通过Lock可以知道有没有成功获取锁,而synchronized却无法办到;
5)Lock可以提高多个线程进行读操作的效率。
ReentrantLock
重入锁。是Lock的实现类。
重入锁简单理解就是对同一个线程而言,它可以重复的获取锁。例如这个线程可以连续获取两次锁,但是释放锁的次数也一定要是两次。
ReentrantLock支持两种获取锁的方式,一种是公平锁,一种是非公平锁。如果是公平锁,则分先来后到的获取锁,如果是非公平锁则谁抢到锁算谁的,这就相当于排队买东西和不排队买东西是一个道理。Java的synchronized
关键字就是非公平锁。ReentrantLock默认是非公平锁,但是可以设置公平锁。
常用方法:构造---new ReentrantLock(), lock()获得锁 unlock()释放锁