死锁问题
1.死锁的理解:
不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁
2.说明:
* 1出现死锁后,不会出现异常,不会出现提示,只是所的线程都处于阻塞状态,无法继续
* 2我们使用同步时,要避免出现死锁。
package main.exer; /** * @Author lx * @Description 死锁问题 * @Date 21:39 2020/8/5 * @Version */ public class DeadLock { public static void main(String[] args) { StringBuffer s1 = new StringBuffer(); StringBuffer s2 = new StringBuffer(); new Thread(){ @Override public 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() { @Override public 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(); } }
此例中创建了两个线程 当两个线程同时开始执行时
线程一遇到synchronized握住s1锁 向下执行 同时线程二遇到synchronized握住s2锁,两个线程同时向下执行,
当线程一又遇到synchronized还需要握住s2锁才能继续执行代码,而线程2同时遇到synchronizedye需要握住s1锁才能执行。
(注意此时线程一并没有释放s1锁,线程二没有释放s2锁) 两者都在等待对方释放握住的锁,而释放锁的条件是执行完代码,但是执行完代码的条件是需要对方释放锁。。。。此时进入死锁。