死锁

来源:互联网 发布:mac cocos2dx lua 编辑:程序博客网 时间:2024/05/20 06:30

解决死锁问题的方法是:一种是用synchronized,一种是用Lock显式锁实现。

而如果不恰当的使用了锁,且出现同时要锁多个对象时,会出现死锁情况,如下:

import java.util.Date; public class LockTest {   public static String obj1 = "obj1";   public static String obj2 = "obj2";   public static void main(String[] args) {      LockA la = new LockA();      new Thread(la).start();      LockB lb = new LockB();      new Thread(lb).start();   }}class LockA implements Runnable{   public void run() {      try {         System.out.println(new Date().toString() + " LockA 开始执行");         while(true){            synchronized (LockTest.obj1) {               System.out.println(new Date().toString() + " LockA 锁住 obj1");               Thread.sleep(3000); // 此处等待是给B能锁住机会               synchronized (LockTest.obj2) {                  System.out.println(new Date().toString() + " LockA 锁住 obj2");                  Thread.sleep(60 * 1000); // 为测试,占用了就不放               }            }         }      } catch (Exception e) {         e.printStackTrace();      }   }}class LockB implements Runnable{   public void run() {      try {         System.out.println(new Date().toString() + " LockB 开始执行");         while(true){            synchronized (LockTest.obj2) {               System.out.println(new Date().toString() + " LockB 锁住 obj2");               Thread.sleep(3000); // 此处等待是给A能锁住机会               synchronized (LockTest.obj1) {                  System.out.println(new Date().toString() + " LockB 锁住 obj1");                  Thread.sleep(60 * 1000); // 为测试,占用了就不放               }            }         }      } catch (Exception e) {         e.printStackTrace();      }   }}