多线程编程(一):死锁+示例代码

什么是死锁:
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

示例代码:

package com.seesun2012.csdn.cn;
/**
 * 死锁
 * 
 * @author [email protected]
 *
 */
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() {
        //  定义t1线程,锁定A变量睡眠2秒去抢占B的资源
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("进入线程t1");
                synchronized (A) {
                    try {
                        Thread.currentThread();
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (B) {
                        System.err.println("1");
                    }
                }
            }
        });

        //  定义t2线程,锁定B变量去抢占A的资源
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("进入线程t2");
                synchronized (B) {
                    synchronized (A) {
                        System.out.println("2");
                    }
                }
            }
        });

        //  启动线程
        t1.start();
        t2.start();

    }

}

如何避免死锁?
避免一个线程同时获取多个锁。
避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。
尝试使用定时锁,使用lock.tryLock(timeout)来代替使用内部所机制。
对于数据库锁,加锁和解锁鼻息在一个数据库连接里进行,否则会出现解锁失败的情况。

猜你喜欢

转载自blog.csdn.net/seesun2012/article/details/79777020