syncohronized和lock的区别
synchronized和Lock
- synchronized是一个关键字,只作用于代码块或者方法;lock是一个接口,必须要有实现类如ReentrantLock,通过lock()和unlock()方法加锁和释放锁
- synchronized在发生异常时,会自动释放线程所占有的锁,因此不会导致死锁,而lock需要手动释放,所以一般会在finally块中释放锁
- synchronized不能让等待锁的线程响应中断,而lock可以中断等待锁的线程
- 比如A线程获取到lock锁,B线程等待A线程锁的释放,但是A花费了很久,这时B线程可以自己中断或者被其他线程中断,比如ReentrantLock去决定是否处理这个中断,如果是那么B线程不再等待这个A释放锁,去做其他事
- 它们都是可重入锁,就是同一个线程可以多次获取同一个锁,不会发生死锁
- lock可以通过tryLock()方法来知道有没有获取到锁,而synchronized不能
- lock可以实现公平锁或者非公平锁,通过Lock lock = new ReentrantLock(true);使用公平锁(默认是非公平锁),synchronized是非公平锁
- 公平锁意味着按顺序执行,等待锁的时间久的线程先执行,非公平锁是没有先后顺序,根据操作系统的调度来决定哪个线程获得锁
- 一般有大量线程竞争时,优先使用lock,lock比如有可中断性、公平性/非公平性,另外性能比synchronized好,lock采用的是乐观锁的形式,synchronized采用的是悲观锁
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.