synchronized:
是一个关键字,作用在类或者对象上。一旦线程A获取到锁,B就需要一直等待直到A释放了锁,所以它是不可中断的,这样子影响效率。使用该关键字,不知道是否获取成功获取到锁。是可重入锁,意思是:假如两个方法method1和method2,都用synchronized修饰,然后在method1中调用method2。调用method1,获取到当前对象锁,执行method2的话不需要再次获取锁了。如果需要的话,就会造成一直请求不到锁的情况。它会在执行完毕或者执行异常的时候,自动释放锁。
Lock:
是一个接口。它允许在等待一段时间后中断等待,而且可以返回是否成功获取锁了。Lock需要手动去释放锁,否则可能会导致死锁。它有一个实现类:ReentranLock(可重入)。有其他几个类:ReadWriteLock、ReentrantReadWriteLock。Lock可以提高多个线程进行读操作的效率。
=概念解析=
1、可重入锁:基于线程的分配。比如一个线程调用同步方法method1获取到了锁,而method1中又调用了同步方法method2,这时候线程不需要再次去获取当前对象的锁了,可以直接执行method2。
2、可中断锁:线程一直等待锁的过程中可以中断请求。在Java中,synchronized就不是可中断锁,而Lock是可中断锁。
3、公平锁:按照请求锁的顺序获取锁。比如同是有多个线程在等待一个锁,当这个锁被释放时,等待时间最久的线程(最先请求的线程)会获得该所,这种就是公平锁。ReentrantLock和ReentrantReadWriteLock,它默认情况下是非公平锁,但是可以设置为公平锁。synchronized是非公平锁。
4、读写锁:分成2个锁(读锁、写锁)ReadWriteLock、ReentrantReadWriteLock