使用锁的原因:
锁:
问题一:锁必须是成对出现的,使用try finally
问题二:使用while而不是if的原因:
问题三:死锁:
进程的创建方式:
单锁实现:
双锁实现:
1.用锁保证线程安全 ReentrantLock lock=new ReentrantLock(); 2.用条件变量 让poll和offer进入等待,而不是不断的循环尝试,让cpu空转 Condition tailWaits = lock.newCondition();//条件变量对象 类似于集合 阻塞进程的存储
AtomicInteger size=new AtomicInteger();//原子整数类 size.getAndIncrement() //类似于size++ 先使用后自增
1.synchronized 关键字,功能少 * 2.ReentrantLock 可重入锁
lock.lock()//1.加锁 或者 lock.lockInterruptibly();//2.上锁,其他进程在等待时,可打断,会抛出异常
try{
....
}finally{
lock.unlock()//解锁
}
多个线程加锁,只会让一个线程加锁成功
while(isFull()){ //从tailWaits中唤醒进程,会与新来的offer的线程争夺,如果后者抢到,则会导致在已满的情况下,继续执行(虚假唤醒),所以改为while tailWaits.await();//当前线程加入集合,并阻塞当前线程 等待tailWaits.signal()唤醒 }
死锁:offer进程先获得了tailLock锁,想要唤醒headWaits.signal()之前, * 另一个进程poll线程获得了headLock锁,想要唤醒tailWaits.signal()之前 * 二者想要获得的第二把锁被对方所拿,所以会死锁 * 解决办法: * 把锁写成平级关系即可
一:
new Thread(()->{queue.offer("e1"),"t1").start(); //线程t1的值为e1
二:
new Thread(()-> { try { queue.offer("e1"); } catch (InterruptedException e) { throw new RuntimeException(e); } },"t1").start();到此这篇阻塞队列最多几个进程(阻塞队列最多几个进程啊)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/13089.html