java线程同步之死锁

来源:互联网 发布:p图 淘宝刷手 编辑:程序博客网 时间:2024/05/21 07:59
/* * 死锁的意思就是,有两个线程第一个线程执行中需要先锁住对象1, * 再锁住对象2就可以执行完,第二个线程需要先锁住对象2, * 再锁住对象1就可以执行完,但是很不幸,两个执行的时候, * 线程1锁住了对象1,线程2锁住了对象2,线程1没有机会 * 锁对象2了,线程2也没有机会锁对象1了 * 解决办法:把锁的粒度加粗 */public class TestDeadLock implements Runnable{int flog;static Object o1 = new Object(),o2 = new Object(); //这里必须是static,要不然锁住的不是同一对象@Overridepublic void run() {System.out.println("flog = " + flog);if(flog == 1) {synchronized (o1) {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}synchronized (o2) {   // 锁住o1里面锁住o2,要不然o1执行完被释放了,下面o2执行完被释放,就不会死锁了System.out.println("....");}}}if(flog == 0) {synchronized (o2) {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}synchronized (o1) {System.out.println("---");}}}}public static void main(String[] args) {TestDeadLock t1 = new TestDeadLock();TestDeadLock t2 = new TestDeadLock();t1.flog = 1;t2.flog = 0;Thread th1 = new Thread(t1);Thread th2 = new Thread(t2);th1.start();th2.start();}}


原创粉丝点击