synchronized和Lock区别
大厂面试题:
我们都知道ArrayList是线程不安全的,请编码写一个不安全的案例并给出解决方案?
公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁。
CountDownLatch、CyclicBarrier、Semaphore使用过吗?
阻塞队列知道吗?
线程池用过吗?ThreadPoolExecutor谈谈你的理解?
线程池用过吗?生产上你是如何设置合理参数?
死锁编码及定位分析?
1、synchronized和Lock区别
(1)原始构成
sychronized是关键字属于JVM层面的,
monitorenter、monitorexit(底层是通过monitor对象来完成的,其实wait/notify方法也依赖于monitor对象,只有在同步块或者同步方法中才能调用wait/notify等方法);
Lock属于具体类(java.util.concurrent.locks.lock)是api层面的锁。
(2)使用方法
synchronized不需要用户手动去释放锁,当synchronized代码执行完成后,系统会自动让线程释放对锁的占用;
ReentrantLock则需要用户手动去释放锁,若没有主动释放锁,就有可能导致出现死锁现象。需要lock()、unlock()方法配合try/finally语句块来完成。
(3)等待是否可中断
synchronized不可中断,除非抛出异常或者正常运行完成;
ReentrantLock可中断:
- 设置超时方法tryLock(long timeout, TimeUnit unit)
- lockInterruptibly()放代码块中,调用interrupt()方法可中断
(4)加锁是否公平
synchronized非公平锁
ReentrantLock两者都可以,默认是非公平锁,构造方法可以传入boolean值,传入的值为true表示公平锁,传入的值为false表示非公平锁。
(5)锁绑定多个条件Condition
synchronized不能绑定多个条件
ReentrantLock用来实现分组需要唤醒的线程们,可以精确唤醒,而不像synchronized那样随便唤醒一个线程或者全部线程。