本文介绍: 一旦代码中出现死锁就会导致线程卡死。当对操作时,如果该锁是就会发生死锁(线程卡死)两个线程两把锁,如果出现这种情况也是会发生死锁:线程t1已经获取了锁A,线程t2已经获取了锁B,此时t1想要获取锁B,t2想要获取锁A。如果此时有N个线程M把锁(N,M>>2),就更加容易发生死锁的情况了。一个非常经典的N个线程M把锁的问题:哲学家就餐问题。假设有5名哲学家围在一张桌子上吃面,现在桌子上有5根筷子。(哲学家会做两件事:思考和吃面(吃面必须要拿到两根筷子,吃完后会将筷子放回原处)。
死锁在多线程代码中是非常严重的BUG,一旦代码中出现死锁就会导致线程卡死。
当单个线程连续两次对同一个对象进行加锁操作时,如果该锁是不可重入锁就会发生死锁(线程卡死)
两个线程两把锁,如果出现这种情况也是会发生死锁:线程t1已经获取了锁A,线程t2已经获取了锁B,此时t1想要获取锁B,t2想要获取锁A。
如果此时有N个线程M把锁(N,M>>2),就更加容易发生死锁的情况了。
假设有5名哲学家围在一张桌子上吃面,现在桌子上有5根筷子。(哲学家会做两件事:思考和吃面(吃面必须要拿到两根筷子,吃完后会将筷子放回原处)。且做这两件事的时间是完全随机的,同一时间只能做一件事)
大多数情况下是不会出现问题的但也会出现一些极端情况:现在所有的哲学家都想吃面,他们同时拿起了自己左手边的筷子,此时每位哲学家手里都有且仅有一只筷子,此时每位哲学家都在等待另一支筷子就会发生死锁。
那么该如何解决死锁问题呢?首先我们先要了解死锁的必要条件,然后根据这些条件来修改。
引发死锁的必要条件
死锁的解决方法
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。