相同点:
1.都是可重入锁(可重入锁指的就是连续两次加锁不会导致死锁.)
2.都保证了可见性与互斥性
3.都可以用于控制多线程对共享对象的访问
不同点:
1.存在层次上: synchronized是Java的关键字,存在于jvm层面上,ReentrantLock是一个类
2.锁的类型:synchronized是非公平锁 ReentrantLock默认非公平锁,但是可支持非公平与公平锁
3.锁的获取:synchronized中 如果A线程获得锁B线程等待,若A发生阻塞,B也会一直等待;
ReentrantLock中 有多种获取锁的方式,会一直尝试去获得锁,线程可以不用一直等待
4.锁的释放:synchronized 对于获取到锁的线程执行完代码块会释放锁,若线程执行异常,jvm会让线程释放锁
ReentrantLock 再finall代码块中必须调用unloc方法释放锁,不然容易造成线程死锁
5.锁的状态:synchronized 无法判断 ReentrantLock可以使用trylock方法判断是否已经获取到锁
6.修饰区域:synchronized 修饰变量,方法,代码块,类 ReentrantLock 只能修饰代码块
7.补充:synchronized 自动获取和释放锁 ReentrantLock 全手动