黑马程序员技术交流社区
标题:
什么是死锁??
[打印本页]
作者:
HM周磊
时间:
2013-3-16 11:02
标题:
什么是死锁??
本帖最后由 HM周磊 于 2013-3-16 18:19 编辑
哪位大神可以详细解说一下吗??
作者:
边道坚
时间:
2013-3-16 11:15
死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。死锁产生有四个必要的条件:互斥条件,不可剥夺条件,部分分配,循环等待,这四个条件不是充分条件,即使这四个条件同时存在,系统也不一定发生死锁,但系统一但发生死锁,这四个条件一定是满足的。
死锁产生的必要条件是:
① 互斥条件:系统中存在一个资源一次只能被一个进程所使用;
② 非抢占条件:系统中存在一个资源仅能被占有它的进程所释放,而不能被别的进程强行抢占。
③ 占有并等待条件:系统中存在一个进程已占有了分给它的资源,但仍然等待其他资源。
④ 循环等待条件:在系统中存在一个由若干进程形成的环形请求链,其中的每一个进程均占有若干种资源中的某一种,同时每个进程还要求(链上)下一个进程所占有的资源。
http://bbs.itheima.com/thread-2453-1-1.html
http://bbs.itheima.com/thread-32333-1-1.html
这是本站的两个贴子 希望也会对你有所帮助
作者:
blackcaismine
时间:
2013-3-16 11:16
我不是大神,详细我也说不出来,我就简单说一种情况吧
假如锁a中嵌套了另一个锁b,那么线程1就要先进a,然后进b
但是如果另一段代码中,是锁b中嵌套了锁a,那么第二个线程就要先进入b,再进入a
a
{
//一段代码
b
{
//一段代码
}
}
b
{
//另一段代码
a
{
//另一段代码
}
}
复制代码
如果线程1进入了a锁,准备进入b的时候,切换到了线程2执行,线程2跑去执行了另一段代码,进入了b锁,那么b锁就被线程2拿到了,那么第一段代码中的线程1再次执行的时候就没法进入嵌套中的b锁了,而线程2也没法进入另一段代码中的a锁,大家就死在这里化成灰了。
作者:
续圆凯
时间:
2013-3-16 11:17
死锁是的:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。
class Deadlocker {
int field_1;
private Object lock_1 = new int[1];
int field_2;
private Object lock_2 = new int[1];
public void method1(int value) {
“synchronized” (lock_1) {
“synchronized” (lock_2) {
field_1 = 0; field_2 = 0;
}
}
}
public void method2(int value) {
“synchronized” (lock_2) {
“synchronized” (lock_1) {
field_1 = 0; field_2 = 0;
}
}
}
}
复制代码
以上代码是一个 导致死锁的例子。
是不恰当调用“synchronized”这个关键词导致的。。
“synchronized”关键词的作用是,确保在某个时刻只有一个线程被允许执行特定的代码块,因此,被允许执行的线程首先必须拥有对变量或对象的排他性的访问权。当线程访问对象时,线程会给对象加锁,而这个锁导致其它也想访问同一对象的线程被阻塞,直至第一个线程释放它加在对象上的锁。
作者:
王洪宇
时间:
2013-3-16 12:59
两个线程A和B。
如果A想调用的资源被B掌握着不放,A就会一直等B释放资源后再运行
B想调用的资源被A掌握着不放,B就会一直等A释放资源后再运行
死锁就是:当A和B分别掌握了对方的资源不放,程序僵持到了这里,就成了死锁。
作者:
HM周磊
时间:
2013-3-16 18:19
blackcaismine 发表于 2013-3-16 11:16
我不是大神,详细我也说不出来,我就简单说一种情况吧
假如锁a中嵌套了另一个锁b,那么线程1就要先进a,然 ...
:victory:还有什么情况呢???
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2