<p id="main-toc"><strong>目录</strong></p>
讯享网
使用锁的原因:
锁:
问题一:锁必须是成对出现的,使用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();</pre>
讯享网

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/165472.html