问:知道哪些锁?
乐观锁和悲观锁。
问:乐观锁有哪些?悲观锁有哪些?
cas是乐观锁,synchronize和Lock都是悲观锁
问:synchronize和Lock的区别
Lock是一个接口,而synchronized是关键字。synchronized会自动释放锁,而Lock必须手动释放锁。Lock可以让等待锁的线程响应中断,而synchronized不会,线程会一直等待下去。通过Lock可以知道线程有没有拿到锁,而synchronized不能。Lock能提高多个线程读操作的效率。synchronized能锁住类、方法和代码块,而Lock是块范围内的。
问:synchronize底层的原理知道吗?
底层其实就是jvm的一个监视器monitor,同步代码块在编译前会在同步方法前加一个monitor.enter指令,退出方法或异常会加monitor.exit指令。其本质就是对一个对象监视器( Monitor
)进行获取,而这个获取过程具有排他性从而达到了同一时刻只能一个线程访问的目的。
问:lock有哪些用法?
A.lock();此方式会始终处于等待中,即使其他线程B调用interrupt()
也不能中断,除非线程A调用LOCK.unlock()
释放锁。
LOCK.lockInterruptibly()
: 此方式会等待,但当调用B.interrupt()
会被中断等待,并抛出InterruptedException
异常,否则会与lock()
一样始终处于等待中,直到线程A释放锁。
LOCK.tryLock()
: 该处不会等待,获取不到锁并直接返回false,去执行下面的逻辑。
LOCK.tryLock(10, TimeUnit.SECONDS)
:该处会在10秒时间内处于等待中,但当调用B.interrupt()
会被中断等待,并抛出InterruptedException
。10秒时间内如果线程A释放锁,会获取到锁并返回true,否则10秒过后会获取不到锁并返回false,去执行下面的逻辑。