您现在的位置是:主页 > news > 安全员c证电子证书查询/排名优化外包公司

安全员c证电子证书查询/排名优化外包公司

admin2025/6/6 8:13:47news

简介安全员c证电子证书查询,排名优化外包公司,淮南网站建设价格,昆明著名网站建设线程的死锁问题 死锁 不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁 出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处于阻塞状态,无法继…

安全员c证电子证书查询,排名优化外包公司,淮南网站建设价格,昆明著名网站建设线程的死锁问题 死锁 不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁 出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处于阻塞状态,无法继…

线程的死锁问题

  • 死锁

不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁

出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处于阻塞状态,无法继续

  • 解决方法

专门的算法、原则

尽量减少同步资源的定义

尽量避免嵌套同步

package com.sq.java1;/*** 演示线程的死锁问题** 1.死锁的理解:不同的线程分别占用对方需要的同步资源不放弃,*   都在等待对方放弃自己需要的同步资源,就形成了线程的死锁** 2.说明:*      1) 出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处于阻塞状态,无法继续*      2) 我们使用同步时,要避免出现死锁。**/
public class ThreadTest {public static void main(String[] args) {StringBuffer s1 = new StringBuffer();StringBuffer s2 = new StringBuffer();new Thread(){@Overridepublic void run() {synchronized (s1){s1.append("a");s2.append("1");// 增加这个加大死锁的概率try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}synchronized (s2){s1.append("b");s2.append("2");System.out.println(s1);System.out.println(s2);}}}}.start();new Thread(new Runnable() {@Overridepublic void run() {synchronized (s2){s1.append("c");s2.append("3");// 增加这个加大死锁的概率try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}synchronized (s1){s1.append("d");s2.append("4");System.out.println(s1);System.out.println(s2);}}}}).start();}
}
/*
第一种答案:
ab
12
abcd
1234第二种答案:
cd
34
cdab
3412*/
package com.sq.java1;// 死锁的演示class A {public synchronized void foo(B b) { // 同步监视器:A类的对象:aSystem.out.println("当前线程名: " + Thread.currentThread().getName()+ " 进入A实例的foo方法"); // ①// 增加这个加大死锁的概率
//        try {
//            Thread.sleep(200);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }System.out.println("当前线程名: " + Thread.currentThread().getName()+ " 企图调用B实例的last方法"); // ③b.last();}public synchronized void last() { // 同步监视器:bSystem.out.println("进入了A类的last方法内部");}
}class B {public synchronized void bar(A a) { // 同步监视器:bSystem.out.println("当前线程名: " + Thread.currentThread().getName()+ " 进入了B实例的bar方法"); // ②// 增加这个加大死锁的概率
//        try {
//            Thread.sleep(200);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }System.out.println("当前线程名: " + Thread.currentThread().getName()+ " 企图调用A实例的last方法"); // ④a.last();}public synchronized void last() {System.out.println("进入了B类的last方法内部");}
}public class DeadLock implements Runnable {A a = new A();B b = new B();public void init() {Thread.currentThread().setName("主线程");// 调用a对象的foo方法a.foo(b);System.out.println("进入了主线程之后");}@Overridepublic void run() {Thread.currentThread().setName("副线程");// 调用b对象的bar方法b.bar(a);System.out.println("进入副线程之后");}public static void main(String[] args) {DeadLock d1 = new DeadLock();new Thread(d1).start();d1.init();}
}
/*
加 try{}catch当前线程名: 主线程 进入A实例的foo方法当前线程名: 副线程 进入了B实例的bar方法当前线程名: 主线程 企图调用B实例的last方法当前线程名: 副线程 企图调用A实例的last方法*/
/*当前线程名: 主线程 进入A实例的foo方法当前线程名: 主线程 企图调用B实例的last方法进入了B类的last方法内部进入了主线程之后当前线程名: 副线程 进入了B实例的bar方法当前线程名: 副线程 企图调用A实例的last方法进入了A类的last方法内部进入副线程之后或者当前线程名: 主线程 进入A实例的foo方法当前线程名: 副线程 进入了B实例的bar方法当前线程名: 主线程 企图调用B实例的last方法当前线程名: 副线程 企图调用A实例的last方法. . . . . .*/