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.对于数据库,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。