package com.javase.deadlock死锁; /** * 死锁代码要会写,只有会写,才会在以后的开发中注意这个事,死锁很难调试。 * 需要注意: * synchronized在开发中最好不要嵌套使用,一不小心就可能会导致死锁现象的发生。 * * * 在今后的开发中我们应该怎么解决线程安全问题? 是一上来就使用synchronized,选择线程同步吗? * 不是的,synchronized会让程序的执行效率降低,用户体验不好。系统的吞吐量降低,用户体验差,只有 * 在不得已的情况下才选择线程同步机制。 * * 第一种方案:尽量使用局部变量来代替"实例变量和静态变量"。 * * 第二种方案:如果必须是实例变量,那么可以考虑创建多个对象,这样实例变量的内存就不共享了。 * (一个线程对应一个对象,一百个线程对应一百个对象,对象不共享,就没有数据安全问题了。) * * 第三种方案:如果不能使用局部变量,对象也不能创建多个,这个时候就只能选择synchronized。线程同步机制了 * */ public class DeadLock { public static void main(String[] args) { Object o1 = new Object(); Object o2 = new Object(); //t1 和 t2 两个线程共享o1 和 o2 两个对象 Thread t1 = new MyThread1(o1,o1); Thread t2 = new MyThread2(o1,o2); //启动线程 t1.start(); t2.start(); } } class MyThread1 extends Thread{ Object o1; Object o2; //无参构造方法 public MyThread1() { } //有参构造方法 public MyThread1(Object o1, Object o2) { this.o1 = o1; this.o2 = o2; } //重写run()方法 @Override public void run() { synchronized (o1){ System.out.println(Thread.currentThread().getName() + "begin"); //这里睡1秒就会成为死锁 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o2){ } } } } class MyThread2 extends Thread{ Object o1; Object o2; //无参构造方法 public MyThread2() { } //有参构造方法 public MyThread2(Object o1, Object o2) { this.o1 = o1; this.o2 = o2; } //重写run()方法 @Override public void run() { synchronized (o2){ System.out.println(Thread.currentThread().getName() + "begin"); //这里睡1秒,就会成为死锁 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o1){ } } } }
Java中关于死锁
于 2022-12-30 14:22:13 首次发布