并发编程中常见的名词

 

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:偏向锁

 

posted @ 2020-03-20 21:09  warrior1234  阅读(163)  评论(0编辑  收藏  举报