多线程:死锁

原创
2014/07/08 16:23
阅读数 123

线程死锁DeadLock是一个令人头疼的问题,有时候很难重现。因为Java是单进程多线程语言,一旦死锁,有时候只能借助进程应用重启应用才能解决问题。

要达到死锁有四个条件:

1:互斥条件:一个资源每次只能被一个线程使用。 2:资源独占条件:一个线程因请求资源而阻塞时,对所持有的资源保持不放。 3:不剥削条件:线程已经获得的资源在未使用之前,不能被强行剥夺。 4:循环等待条件: 若干线程之间形成了一种头尾相接的循环等待资源关系。

要解决线程死锁就要从这四个条件入手。一般情况下可以:

1:避免或者减少资源共享 一个资源被多个线程共享,如果采用同步机制,那么死锁的可能性非常的大。特别是在项目比较庞大的情况下,很难杜绝死锁。对此最好的办法就是减少资源共享。

2:使用自旋锁 可以使用tryLock实现自旋锁(Spin Lock),它跟互斥锁一样,如果想要访问被自旋锁保护的资源,必须先得到锁,在访问完共享资源之后,也必须释放锁。如果在获得自旋锁的时候,没有任何执行单元保持该锁,那么就会立即获得锁,如果在获得自旋锁的时候已经有了保持者,那么获取锁的操作就会自旋在那里,直到自旋锁的保持者释放该锁。比如线程A等待线程B释放锁,在两秒内不断的尝试获取锁,达到两秒还没有获取锁资源。线程A结束运行。线程B继续持有资源继续执行,死锁解除。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部