zoukankan      html  css  js  c++  java
  • 一个Java线程死锁的例子

    package com.lk.B;
    
    public class Test4 {
    	private static final Object o1 = new Object();
    	private static final Object o2 = new Object();
    	
    	private class Run1 implements Runnable{
    
    		@Override
    		public void run() {
    			// TODO Auto-generated method stub
    			String threadName = Thread.currentThread().getName();
    			synchronized (o1) {
    				try {
    					Thread.sleep(1000);
    				} catch (InterruptedException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    				System.out.println(threadName+"进入同步块o1准备进入o2");
    				synchronized (o2) {
    					System.out.println(threadName+"已经进入同步块o2");
    				}
    			}
    		}
    		
    	}
    	
    	private class Run2 implements Runnable{
    
    		@Override
    		public void run() {
    			// TODO Auto-generated method stub
    			String threadName = Thread.currentThread().getName();
    			synchronized (o2) {
    				try {
    					Thread.sleep(1000);
    				} catch (InterruptedException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    				System.out.println(threadName+"进入同步块o2准备进入o1");
    				synchronized (o1) {
    					System.out.println(threadName+"已经进入同步块o1");
    				}
    			}
    		}
    		
    	}
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Thread t1 = new Thread(new Test4().new Run1());
    		Thread t2 = new Thread(new Test4().new Run2());
    		t1.start();
    		t2.start();
    	}
    
    }
    

      

      控制台的红色按钮笔试程序并没有运行结束,因为处于死锁状态

      当程序启动后,第一个线程执行Run1类中的run方法,此时为o1加锁,然后线程休眠1s。然后第二个线程执行Run2类中的run方法,此时为o2加锁,然后线程休眠1s。此时第一个线程已经休眠结束,开始为o2加锁,而o2已经被加锁,因此发生了死锁。

  • 相关阅读:
    mormot2封装tcp
    mormot.net.client.pas
    mormot.net.server.pas
    delphi working with big data databases in Cassandra, Couchbase and MongoDB
    Grijjy.ProtocolBuffers.pas
    Grijjy.Bson.Serialization.pas
    GrijjyFoundation开源框架
    Unidac内存表使用
    传统关系型数据库正在完成华丽的蜕变
    使用arthas 分析java 应用的一个流程总结
  • 原文地址:https://www.cnblogs.com/luankun0214/p/4398692.html
Copyright © 2011-2022 走看看