1:死锁
多个线程(至少2个)竞争多个(至少2个)独占资源时,例如:线程1 占有 资源a,同时又去申请资源b,
线程2占有资源b,同时又去申请a,这样线程1 和 2 就会出现死锁,如果没有外力的情况下,这种情况永远不会解开。
发生死锁必须具备的条件:
a:独占资源 资源必须是互斥的,同一时刻只能有有个线程占有
b:请求和保持,一个线程在占有资源的同时,又去申请其他的独占资源
c:不可剥夺,一个线程占有资源,除非自己主动是否,否则不可强行剥夺它的占有
d:循环等待,就是多个线程申请资源形成了一个闭环,才会发生。
2:活锁
任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复 尝试,失败,尝试,失败。
例如两个人过桥,a 和b 相对而行,都互相礼貌想让,但是他们礼让的方向一下,那么这样两人都没法过桥。
3:线程饥饿
线程饥饿是因为一个线程长时间分配不到cpu时间片而导致。
4:悲观锁
悲观者认为事情一定会发生,对于独占资源,认为一定存在并发抢占问题,所以在先上锁,再使用,那么其他的线程就
会被阻塞,例如内置锁synchronized和显示锁ReentrantLock都是悲观锁
5:乐观锁
乐观者认为事情不会发生,所以对于独占资源采用不加锁的方式,但是在对资源进行操作前会首先判断资源所处的状态是否
和之前一致,如果一致说明没有其他线程修改该资源,则更新,如果不一致则从新读取资源状态,再次判断是否有其他线程操作,
没有则更新。例如在数据库表或者字段加版本号或者java并发里面的cas都是乐观锁
6:偏向锁