• 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

  • 相关阅读:
    WebBrowser.ExecWB的完整说明
    jQuery选择器的灵活用法
    Nooice, 首次开通博客园
    【HDU】3663 Power Stations
    【HDU】4069 Squiggly Sudoku
    【FOJ】2076 SUDOKU
    【HDU】3529 Bomberman Just Search!
    【HDU】3909 Sudoku
    【HDU】2780 SuSuSudoku
    【HDU】3111 Sudoku
  • 原文地址:https://www.cnblogs.com/499755609cola/p/10330438.html
Copyright © 2020-2023  润新知