赞
踩
一、首先死锁需要满足以下几个条件:
多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放,而该资源又被其他线程锁定,从而导致每一个线程都得等其它线程释放其锁定的资源,造成了所有线程都无法正常结束。这是从网上其他文档看到的死锁产生的四个必要条件:
当上述四个条件都成立的时候,便形成死锁。当然,死锁的情况下如果打破上述任何一个条件,便可让死锁消失。下面用java代码来模拟一下死锁的产生。
二、解决办法:
只要打破四个必要条件中的一个,当然互斥不能打破,否则就会带来线程安全性问题,破坏原子性。
1、死锁“车祸”现场,代码示例:
- package com.jason.thread.deadthread;
-
- import static java.lang.Thread.sleep;
-
- /**
- * @program: JasonSpringBoot
- * @description
- * @author: 大龄程序猿
- * @create: 2020-05-23 23:50
- **/
- public class TestMain {
- public static void main(String[] args) {
- Thread thread1=new Thread(new Thread1(),"thread1");
- Thread thread2=new Thread(new Thread2(),"thread2");
- thread1.start();
- thread2.start();
- }
-
- }
-
- class Thread1 implements Runnable
- {
- @Override
- public void run() {
- try {
- synchronized (Lock.lock1) {
- System.out.println("Thread1 lock resource1");
- Thread.sleep(2000);
- synchronized (Lock.lock2) {
- System.out.println("Thread1 lock resource2");
- }
- System.out.println("Thread1 release resource2");
- }
- System.out.println("Thread1 release resource1");
- }catch (Exception e)
- {
- e.printStackTrace();
- }
- }
- }
- class Thread2 implements Runnable
- {
- @Override
- public void run() {
- try {
- synchronized (Lock.lock2) {
- System.out.println("Thread2 lock resource2");
- Thread.sleep(2000);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。