zoukankan      html  css  js  c++  java
  • java死锁示例及其发现方法

    在java多线程编程中很容易出现死锁,死锁就是多个线程相互之间永久性的等待对方释放锁,这和数据库多个会话之间的死锁类似。下面的代码示例了一个最简单的死锁的例子,线程1和线程2相互之间等待对方释放锁来取得cpu执行权。

    class DeadLockTest implements Runnable{
    	
    	private String str;
    	
    	private Object lock1 = new Object();
    	
    	private Object lock2 = new Object();
    	
    	public void run()
    	{
    		if(str.equals("a"))
    		{
    			synchronized(lock1)
    			{
    				try {
    					System.out.println("str is a ! thread-name:" + Thread.currentThread().getName());
    					Thread.sleep(3000l);
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    				synchronized (lock2) {
    					System.out.println("lock1 -- > lock2 !");
    				}
    			}
    		}
    		if(str.equals("b")) {
    			synchronized (lock2) {
    				System.out.println("str is b ! thread-name:" + Thread.currentThread().getName());
    				synchronized (lock1) {
    					System.out.println("lock2 -- > lock1 !");
    				}
    			}
    		}
    			
    	}
    
    	public String getStr() {
    		return str;
    	}
    
    	public void setStr(String str) {
    		this.str = str;
    	}
    	
    	
    }

    main方法代码:

    public class LockReGetDemo {
    	public static void main(String[] args) throws InterruptedException {
    		DeadLockTest deadLock = new DeadLockTest();
    		Thread t1 = new Thread(deadLock);
    		deadLock.setStr("a");
    		t1.setName("A");
    		t1.start();
    		Thread.sleep(500l);
    		Thread t2 = new Thread(deadLock);
    		t2.setName("B");
    		deadLock.setStr("b");
    		t2.start();
    	}
    }

    运行后你会发现,打印结果如下,后面的内容一致不会打印,并且程序一直处于等待状态:

    str is a ! thread-name:A
    str is b ! thread-name:B

    那么如何检测死锁呢? 在jvm中给我们提供了一些使用的工具,比如jps和jstack,jps用来查看运行的进程及其id,jstack用来查看具体线程id的运行信息,在上面的死锁例子中,我们进入jvm安装的bin目录,控制台运行jps命令:

     

    然后使用jstack命令查看进程信息

    这样就可以知道哪里出现了死锁。

     原文链接:http://www.j2eeweb.com/front/get?id=5c4eb0903c517020beb2539e

  • 相关阅读:
    GNU make manual 翻译( 一百五十)
    [导入]Google开发者日见闻 王开源现身
    [导入]微软中国原高管宫力就任火狐中国总经理
    [导入]QQTalk Beta1 简体中文版
    [导入]《南方都市报》:国产龙芯产业化 难
    [导入][多图]Nokia正式发布奢华8600/6500双子手机
    [导入]用户界面设计的技巧与技术
    [导入]BitComet(比特彗星) 0.89
    [导入]µTorrent 1.7 beta 2248
    今天我注册了
  • 原文地址:https://www.cnblogs.com/499755609cola/p/10330438.html
Copyright © 2011-2022 走看看