当前位置:首页>开发>正文

在java中,死锁形成的原因是 java关于死锁怎么产生的。

2023-06-09 12:15:56 互联网 未知 开发

 在java中,死锁形成的原因是 java关于死锁怎么产生的。

在java中,死锁形成的原因是?

死锁是进程死锁的简称,是由Dijkstra于1965年研究银行家算法时首先提出来的。它是计算机操作系统乃至并发程序设计中最难处理的问题之一。实际上,死锁问题不仅在计算机系统中存在,在我们日常生活中它也广泛存在。
1.什么是死锁
我们先看看这样一个生活中的例子:在一条河上有一座桥,桥面较窄,只能容纳一辆汽车通过,无法让两辆汽车并行。如果有两辆汽车A和B分别由桥的两端驶上该桥,则对于A车来说,它走过桥面左面的一段路(即占有了桥的一部分资源),要想过桥还须等待B车让出右边的桥面,此时A车不能前进;对于B车来说,它走过桥面右边的一段路(即占有了桥的一部分资源),要想过桥还须等待A车让出左边的桥面,此时B车也不能前进。两边的车都不倒车,结果造成互相等待对方让出桥面,但是谁也不让路,就会无休止地等下去。这种现象就是死锁。如果把汽车比做进程,桥面作为资源,那麽上述问题就描述为:进程A占有资源R1,等待进程B占有的资源Rr;进程B占有资源Rr,等待进程A占有的资源R1。而且资源R1和Rr只允许一个进程占用,即:不允许两个进程同时占用。结果,两个进程都不能继续执行,若不采取其它措施,这种循环等待状况会无限期持续下去,就发生了进程死锁。
在计算机系统中,涉及软件,硬件资源都可能发生死锁。例如:系统中只有一台CD-ROM驱动器和一台打印机,某一个进程占有了CD-ROM驱动器,又申请打印机;另一进程占有了打印机,还申请CD-ROM。结果,两个进程都被阻塞,永远也不能自行解除。
所谓死锁,是指多个进程循环等待它方占有的资源而无限期地僵持下去的局面。很显然,如果没有外力的作用,那麽死锁涉及到的各个进程都将永远处于封锁状态。从上面的例子可以看出,计算机系统产生死锁的根本原因就是资源有限且操作不当。即:一种原因是系统提供的资源太少了,远不能满足并发进程对资源的需求。这种竞争资源引起的死锁是我们要讨论的核心。例如:消息是一种临时性资源。某一时刻,进程A等待进程B发来的消息,进程B等待进程C发来的消息,而进程C又等待进程A发来的消息。消息未到,A,B,C三个进程均无法向前推进,也会发生进程通信上的死锁。另一种原因是由于进程推进顺序不合适引发的死锁。资源少也未必一定产生死锁。就如同两个人过独木桥,如果两个人都要先过,在独木桥上僵持不肯后退,必然会应竞争资源产生死锁;但是,如果两个人上桥前先看一看有无对方的人在桥上,当无对方的人在桥上时自己才上桥,那麽问题就解决了。所以,如果程序设计得不合理,造成进程推进的顺序不当,也会出现死锁。
2.产生死锁的必要条件
从以上分析可见,如果在计算机系统中同时具备下面四个必要条件时,那麽会发生死锁。换句话说,只要下面四个条件有一个不具备,系统就不会出现死锁。
〈1〉互斥条件。即某个资源在一段时间内只能由一个进程占有,不能同时被两个或两个以上的进程占有。这种独占资源如CD-ROM驱动器,打印机等等,必须在占有该资源的进程主动释放它之后,其它进程才能占有该资源。这是由资源本身的属性所决定的。如独木桥就是一种独占资源,两方的人不能同时过桥。
〈2〉不可抢占条件。进程所获得的资源在未使用完毕之前,资源申请者不能强行地从资源占有者手中夺取资源,而只能由该资源的占有者进程自行释放。如过独木桥的人不能强迫对方后退,也不能非法地将对方推下桥,必须是桥上的人自己过桥后空出桥面(即主动释放占有资源),对方的人才能过桥。
〈3〉占有且申请条件。进程至少已经占有一个资源,但又申请新的资源;由于该资源已被另外进程占有,此时该进程阻塞;但是,它在等待新资源之时,仍继续占用已占有的资源。还以过独木桥为例,甲乙两人在桥上相遇。甲走过一段桥面(即占有了一些资源),还需要走其余的桥面(申请新的资源),但那部分桥面被乙占有(乙走过一段桥面)。甲过不去,前进不能,又不后退;乙也处于同样的状况。
〈4〉循环等待条件。存在一个进程等待序列{P1,P2,...,Pn},其中P1等待P2所占有的某一资源,P2等待P3所占有的某一源,......,而Pn等待P1所占有的的某一资源,形成一个进程循环等待环。就像前面的过独木桥问题,甲等待乙占有的桥面,而乙又等待甲占有的桥面,从而彼此循环等待。
上面我们提到的这四个条件在死锁时会同时发生。也就是说,只要有一个必要条件不满足,则死锁就可以排除。
8.2 死锁的预防
前面介绍了死锁发生时的四个必要条件,只要破坏这四个必要条件中的任意一个条件,死锁就不会发生。这就为我们解决死锁问题提供了可能。一般地,解决死锁的方法分为死锁的预防,避免,检测与恢复三种(注意:死锁的检测与恢复是一个方法)。我们将在下面分别加以介绍。
死锁的预防是保证系统不进入死锁状态的一种策略。它的基本思想是要求进程申请资源时遵循某种协议,从而打破产生死锁的四个必要条件中的一个或几个,保证系统不会进入死锁状态。

java关于死锁怎么产生的。

不是这样的,synchronized块的作用不是上锁而是进入当前对象的monitor,你没有对对象有任何的wait等等的对象操作是不会有任何所谓的死锁效果的,也就是当前块代码执行完毕之后就可以继续再次执行了,而方法的synchronized也如此,只不过它直接把你正在使用的实例对象或者是当前类的class对象(后者是静态方法的情况)而已。
你这样子非常有可能t1执行完毕(循环内)时进入等待而去执行t2,以此类推

再补充一句
同步锁是有先后执行顺序的
所以会t1->t2->t1->t2->t1....这样子循环下去

java里,死锁是怎么发生的

死锁属于操作系统的概念了……其实很好理解。最经典的例子就是,You first,You first问题。一个门,两个“中国人”,都很有礼貌,走碰头了,都想过这个门,两个人都谦让对方先过,结果是,谁也过不去……。还有就是哲学家问题!说是四个哲学家坐在桌子上等着吃饭,每个人一边一根筷子,四个人四根筷子。一个人拿到两根筷子的时候才能吃。否则等待…… ,有一种情况就是,四个人,每个人都拿了一根筷子,还没有人放手。结果四个人都饿死……
所以死锁发生需要几个条件
1.循环等待
2.不可剥夺
3.资源独占
4.这个忘掉了……不好意思……想起来了。是保持申请……

程序并发的时候 就是两个以上的线程对一个数据进行访问操作的时候
为了防止双方互相影响导致错误 会让先进行的线程进行操作 后来的进行等待
先来的进行了一部分操作 但是还没有弄完的时候 对于后来的来说 这一部分就是锁定的

如果上锁上的不好的时候 两个线程都进行了部分操作 都在等待对方的操作完成 导致都进行不了 就是死锁

Java中死锁是同步造成的还是异步造成的?

标准的答案!死锁是这要发生的。A,B,C三个线程都拿着一个资源同时请求另一个由其它人占用的资源,多个参与者的情况也是类似的,反正就是像我们平时说的一手交钱,一手交货,但双方都不放手的过程。因此只有至少2个参与方同时进行时才会死锁,而同步是一个先做,另一个再接着做,那就不会死锁,因为A没完成时,B还没开始运行,所以B不可能抢了A需要的资源。

Java中线程死锁是什么意思?

两个或者多个线程之间相互等待,导致线程都无法执行,叫做线程死锁。

产生死锁的条件:

1.有至少一个资源不能共享

2.至少有一个任务必须持有一个资源并且等待获取另一个被别的任务持有的资源

3.资源不能任务抢占

4.必须有循环等待

高淇Java300集视频教程对线程死锁有详细的讲解。

cyclicbarrier线程池下使用为什么会死锁

Java线程死锁需要如何解决,这个问题一直在我们不断的使用中需要只有不断的关键。不幸的是,使用上锁会带来其他问题。让我们来看一些常见问题以及相应的解决方法: Java线程死锁 Java线程死锁是一个经典的多线程问题

最新文章