Cyh的博客

Email:kissyan4916@163.com
posts - 26, comments - 19, trackbacks - 0, articles - 220

线程10--一个死锁的例子

Posted on 2009-06-02 21:41 啥都写点 阅读(391) 评论(0)  编辑  收藏 所属分类: J2SE
关键技术:
  • 当线程进入对象的synchronized代码时,便占据了资源,直到它退出该代码块或者调用wait方法时,才释放该资源,在此期间,其他线程将不能进入该代码块。
  • 当线程互相持有对方需要的资源时,会互相等待对方释放资源,如果线程都不主动释放占据的资源,将产生死锁。

package book.thread;

/**
 * 一个线程死锁的例子
 
*/
public class DeadLock {
    
public static void main(String[] args) {
        
// 2个资源
        final Object resource1 = "resource1";
        
final Object resource2 = "resource2";
        
// 第一个线程,想先占有resource1,再尝试着占有resource2
        Thread t1 = new Thread() {
            
public void run() {
                
//尝试占有了resource1
                synchronized (resource1) {
                    
//成功占有resource1
                    System.out.println("Thread 1: locked resource 1");
                    
//休眠一段时间
                    try {
                        Thread.sleep(
50);
                    } 
catch (InterruptedException e) {
                    }
                    
// 尝试着占有resource2,如果不能占有,该线程会一直等待
                    synchronized (resource2) {
                        System.out.println(
"Thread 1: locked resource 2");
                    }
                }
            }
        };

        
// 第二个线程,想先占有resource2,再占有resource1
        Thread t2 = new Thread() {
            
public void run() {
                
// 尝试着占有resource2
                synchronized (resource2) {
                    
// 成功占有resource2
                    System.out.println("Thread 2: locked resource 2");
                    
// 休眠一段时间
                    try {
                        Thread.sleep(
50);
                    } 
catch (InterruptedException e) {
                    }
                    
// 尝试占有resource1,如果不能占有,该线程会一直等待
                    synchronized (resource1) {
                        System.out.println(
"Thread 2: locked resource 1");
                    }
                }
            }
        };
        
// 启动两个线程
        t1.start();
        t2.start();
    }
}


                                                                                                       --    学海无涯