说说如何实现分布式锁?(一)
常见的实现分布式锁有两种方式
基于redis实现分布式锁:核心思想是获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁
基于zookeeper的实现方式,核心思想在zk中是为每个线程生成一个有序的临时节点,为确保有序性,在排序一次全部节点,获取全部节点,每个线程判断自己是否最小,如果是的话,获得锁,执行操作,操作完删除自身节点。如果不是第一个的节点则监听它的前一个节点,当它的前一个节点被删除时,则它会获得锁,以此类推。特别注意,这里新建节点必须要是临时节点,确保获取到锁的客户端宕机也不影响其他客户端获取锁
使用redis的优点是性能高,缺点是特定情况下master宕机,数据没完成同步,其他客户端可以继续获取到锁
使用zk的优点是能保证一致性,缺点是频繁读写,性能较差
说说什么时候会产生死锁,以及程序中发生死锁如何排查?(二)
要产生死锁,必须满足以下几个条件
资源互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用
不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放
请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有
循环等待,即存在一个等待队列:A占有B的资源,B占有A的资源这样就形成了一个等待环路。程序发生死锁时,可以使用jstack命令查看线程快照,可以看到线程的状态是死锁状态
本面试题来自包括00多道后端面试题,包括连环问、IO源码、JUC源码、中间件、数据库、缓存等各个主流题目,N多同学也验证过,基本后端面试10~25k的题目,这里包括90%
面试题取-xdclass