-
原始构成:
- synchronized是JVM层面提供的关键字;
- lock是JUC包下的一个接口;
-
使用方法:
- synchronized不需要用户去手动释放锁,当synchronized代码执行完后系统会自动让线程释放对锁的占用;
- ReentrantLock需要用户去手动释放锁,如果没主动释放,就可能导致死锁现象;
-
等待是否可中断:
- synchronized不可中断,除非抛出异常或者正常运行完成;
- ReentrantLock可以中断,①设置超时方法tryLock(Long timeout, TimeUnit unit);②代码块中调用lock.lockInterruptibly()中断等待获取锁线程,然后调用thread.interrupt中断;
-
加锁是否公平:
- synchronized是非公平锁;
- ReentrantLock默认是非公平锁,但是构造方法可以传入boolean值,true为公平锁,默认为false非公平锁;
-
阻塞唤醒机制不同:
- synchronized通过wait-notify/notifyAll只能随机唤醒一个或者全部线程;
- ReentrantLock通过condition可以实现分组唤醒需要唤醒的线程,可以精准唤醒。