synchronized与Lock的区别
- synchronized是java内置关键字,属于jvm层面;Lock是一个接口(常用的实现类为ReentrantLock);
- synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;
- synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ,b 线程执行过程中发生异常会释放锁);Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;
- 用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待,如果线程1阻塞,线程2则会一直等待下去。Lock锁就不一定会等待下去,如果尝试获取不到锁(使用tryLock(), tryLock(long timeout, TimeUnit unit)方法),可以判断返回值boolean是否能获取到锁进行后续处理;
- synchronized使用Object对象本身的wait 、notify、notifyAll调度机制,而Lock可以使用Condition进行线程之间的调度
- Lock可以提高多个线程进行读操作的效率。(可以通过Readwritelock实现类进行读写分离)
- 当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。