最近研究死锁,很多都写到避免死锁,可有时突然让你写一个死锁程序,会突然大脑短路的,故网上搜了搜,记录一下,写了一个死锁的小例子。
主要思路就是开两个线程,两个线程共同竞争两个资源,第一个线程先占有第一个资源,sleep,然后请求占领第二个资源。同理第二个线程先占有第二个资源,sleep,然后请求占领第一个资源。两个线程都会因为不放弃已占有的资源锁导致对方无法请求到所请求的资源。貌似有点绕了,其实意思很简单,就好比 吃着碗里的 望着锅里的一样,一共一个锅一个碗,有碗的想要锅,有锅的想要碗,结果谁也要不到,因为有碗的不会放弃碗,有锅的不会放弃锅。
具体代码如下

package com.test.lock;
/** 
 * @author
 * @version 创建时间:2015-6-5 上午10:12:55 
 * 一个简单的死锁例子
 */
public class DeadLock implements Runnable {

	
	public int flag = 1;
	//o1,o2必须是静态的,即必须为所有线程所共有,共同竞争资源,才会造成死锁
	static Object o1 = new Object();
	static Object o2 = new Object();
	
	@Override
	public void run() {
		System.out.println("flag="+flag);
		if(1==flag){
			synchronized (o1) {
				try {
					Thread.sleep(100);
				} catch (Exception e) {
					e.printStackTrace();
				}
				synchronized (o2) {
					System.out.println("1");
				}
			}
			
		}
		if(0==flag){
			synchronized (o2) {
				try {
					Thread.sleep(100);
				} catch (Exception e) {
					e.printStackTrace();
				}
				synchronized (o1) {
					System.out.println("0");
				}
			}
			
		}
	}
	public static void main(String[] args) {
		DeadLock d1 = new DeadLock();
		DeadLock d2 = new DeadLock();
		d1.flag = 1;
		d2.flag = 0;
		new Thread(d1).start();
		new Thread(d2).start();
	}

}

tomcat参数详解与性能优化

其实,前面有些文章已经涉及到相关的内容了,比如: 快速学会Linux安装jdk和tomcat tomcat部署应用的三种方法 本文会详细介绍一下在tomcat安装完成之后一般...

阅读全文

tomcat部署应用的三种方法

在JavaWeb的开发中,tomcat是最常用的web容器,使用tomcat部署web应用,常见的有三种方式,下面以我们在前面开发过的一个WebService的服务端为例(具体服务开...

阅读全文

JavaWeb开发(四)CXF webService 客户端开发(动态调用与wsdl2java生成)

前面三章分别介绍了: JavaWeb开发(一)框架搭建(使用Maven搭建JavaWeb工程) JavaWeb开发(二)框架搭建(给工程添加spring支持) JavaWeb开发(三)CXF ...

阅读全文

欢迎留言