2.并发编程挑战-死算

 返回主目录

 com.qdb.thinkv.thread

package com.qdb.thinkv.thread;
/**
 * 死锁是指两个或两个以上的进程在执行过程中,
 * 由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,
 * 若无外力作用,它们都将无法推进下去。
 * 此时称系统处于死锁状态或系统产生了死锁,
 * 这些永远在互相等待的进程称为死锁进程
 * 
 * 思考如何避免死锁
 * @author gengyunchong
 *
 */
public class DeadLockDemo {
    private static String A="A";
    private static String B="B";
    
    public static void main(String[] args) {
        new DeadLockDemo().deadLock();
    }
    
    private void deadLock(){
        Thread t1=new Thread(new Runnable(){

            public void run() {
                synchronized (A) {
                    try {
                        Thread.currentThread().sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (B) {
                        System.out.println("1");
                    }
                }
            }
            
        });
        
        Thread t2=new Thread(new Runnable(){
            public void run() {
                synchronized (B) {
                    
                    synchronized (A) {
                        System.out.println("2");
                    }
                }
            }
        });
        
        t1.start();
        t2.start();
    }
}

 

 

避免死锁的几种方式

1.避免一个线程同时获取多个锁。

2.避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。

3.尝试使用定时锁。使用lock.tryLock(time out)来替换使用内部锁机制。

4.对于数据库,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。

posted @ 2018-06-03 14:37  yunchong1019  阅读(150)  评论(0编辑  收藏  举报