BlockingQueue
BlockingQueue是并发容器的一种,在J.U.C的包路径下,是线程安全的一种实现,是基于阻塞队列的,该接口提供了相对于Queue的新的put()和take()操作。put()添加元素时,当阻塞队列满的情况下会阻塞下来,当有空间时才能进行添加操作,添加到队列尾部;take()删除元素时,当队列为空时,也会阻塞,当有元素时才能进行删除操作,删除队列头部元素。该接口不接受存储null值,否则会抛出NUllPointerException的异常;BlockingQueue是可以指定容量的,如果超过了就会就行阻塞;它是线程安全的,他的实现类内部可以使用内部锁或者其他形式的并发控制来实现线程安全。
ArrayBlockingQueue fairQueue = new ArrayBlockingQueue(100,true);//大小为100的公平队列 ArrayBlockingQueue fairQueue = new ArrayBlockingQueue(100,false);//大小为100的非公平队列
死锁
指的是两个或者两个以上的进程在执行的过程中,由于竞争资源而造成阻塞,若无外力作用下则无法继续推进,此时称作系统的死锁状态。
死锁产生的原因:
死锁代码实例(两个进程竞争同一个资源):
public class DeadLockDemo { private static Object object = new Object(); private static Object object1 = new Object(); public static void main(String[] args) { //线程t1先获取object,再获取object1 //线程t2先获取object1,再获取object Runnable t1 = new Runnable() { @Override public void run() { synchronized (object){ System.out.println("线程t1获取到资源object"); synchronized (object1){ System.out.println("线程t1获取到资源object1"); } } } }; Runnable t2 = new Runnable() { @Override public void run() { synchronized (object1){ System.out.println("线程t2获取到资源object1"); synchronized (object){ System.out.println("线程t2获取到资源object"); } } } }; //线程启动 new Thread(t1).start(); new Thread(t2).start(); } }
死锁产生的四个必要条件:
请求与保持条件: 一个进程因请求资源而阻塞时,对已获得的资源保持不放
死锁的解除与预防(预防,避免,检测与恢复)
原文:https://www.cnblogs.com/128-cdy/p/13160863.html