javaSE-线程死锁

来源:互联网 发布:php 数组弹出第一个 编辑:程序博客网 时间:2024/05/17 07:13
/*
同步的另一个弊端:
容易引发死锁。

开发时,尽量避免同步嵌套的情况。


*/
class Ticket implements Runnable{private int num = 100;boolean flag = true;Object obj = new Object();public void run(){if(flag){while(true){synchronized(obj){sale();}}}elsewhile(true){this.sale();}}public synchronized/**/ void sale()//同步函数。{synchronized(obj){if(num>0){try{Thread.sleep(10);}catch(InterruptedException e){}System.out.println(Thread.currentThread().getName()+"..sale:"+num--);}}}}class ThreadDemo7_Ticket_DeadLock{public static void main(String[] args) {Ticket t = new Ticket();Thread t1 = new Thread(t);Thread t2 = new Thread(t);t1.start();try{Thread.sleep(10);}catch(InterruptedException e){}t.flag = false;t2.start();}}

死锁代码演示


class Demo implements Runnable {private boolean flag;Demo(boolean flag) {this.flag = flag;}public void run() {if (flag) {while (true) {synchronized (MyLock.LOCKA) {System.out.println("if locka");synchronized (MyLock.LOCKB) {System.out.println("if lockb");}}}} else {while (true) {synchronized (MyLock.LOCKB) {System.out.println("else lockb");synchronized (MyLock.LOCKA) {System.out.println("else locka");}}}}}}class MyLock {public static final Object LOCKA = new Object();public static final Object LOCKB = new Object();}class ThreadDemo8_DeadLock {public static void main(String[] args) {Demo d1 = new Demo(true);Demo d2 = new Demo(false);Thread t1 = new Thread(d1);Thread t2 = new Thread(d2);t1.start();t2.start();}}


0 0