不积跬步无以至千里,后继才能薄发
线程在相互等待
可以通过 System.identityHashCode()
方法获取锁对象的hash,然后通过hash值进行判断,保证每次获取锁的顺序都是一致的,避免因获取锁顺序导致死锁
在获取了锁的方法中调用一个需要获取另一个锁的方法,可能会导致死锁,可以通过降低锁的粒度,使得方法调用同步代码块不包含需要获取锁的方法调用。保证开放调用。
获取锁时设置超时时间,避免无限期等待下去
线程无法访问需要的资源导致无法执行,叫做饥饿,如等待cpu周期、等待其他锁释放。
线程陷入活锁时不会阻塞线程,但是会一直重试,循环执行相同的操作,例如消息队列消费者处理时出错回滚,并把消息重新发送回队列中,导致活锁,这样的消息也叫 毒药消息(Poison Message)
在重试机制中引入随机性可以避免活锁