一、锁类型
-
可重入锁:在执行的对象中,所有同步方法不用再次获得锁。Synchronized和ReentrantLook都是可重入锁。
-
可中断锁:在等待获取过程中可中断。Synchronized内置锁是不可中断锁,ReentrantLock可以通过lockInterruptibly方法中断显性锁。
-
公平锁:按等待获取锁的进程获取,等待时间长的具有优先获取锁的权力。synchronized隐性锁是非公平锁,它无法保证等待的线程获取锁的顺序,ReentrantLook可以自己控制是否公平锁。
-
读写锁:对资源读取和写入的时候拆分为两部分处理,读的时候可以多线程一起读,写的时候必须同步写。ReadWriteLock是一个读写锁,通过readLock()获取读锁,通过writeLock()获取写锁。
二、synchronized和Lock的区别
-
synchronized是Java的一个关键字;Lock是一个接口。
-
synchronized在线程异常时会自动释放锁,不会发生死锁;Lock在线程异常时,不会自动释放锁,需要在异常抛出的finally中实现释放锁。
-
sybchronized是非中断锁,需等待线程执行完成才能释放锁;而Lock是可以中断锁。
-
在性能上,synchronized是少量同步,而Lock是大量同步。
-
synchronized的锁状态是无法判断的,Lock的锁状态是可以判断的。