并发知识学习

一 任务阻塞的可能原因

 

1:调用了sleep,线程进入休眠状态,在指定时间内不会允许

 

2:调用wait()将线程挂起,直到线程得到了notify()或者notifyAll()的消息(或者在java.util.concurrent类库种等价的signal()或signalAll()),线程才会进入就绪状态

 

3:任务在等待某个输入/输出完成

 

4:任务试图在某个对象上调用其同步控制方法,但是对象锁不可用,因为另外一个任务已经获得了锁

 

 

synchronized和ReentrantLock的区别,synchronized上阻塞的任务不可中断,ReentrantLock阻塞的任务可以被中断

 

二 线程间的协调

 

使用wait可以使任务挂起,并将锁释放,等待notify,notifyAll的通知,sleep也会将任务挂起,但是sleep不会释放锁。wait,notify,notifyAll是属于Object的方法,只能在synchronized修饰的方法或者代码块中调用,否则将会抛出IllegalMonitorStateException异常

 

三 生产者消费者

声生产者与消费者的实现可以使用wait,notify,notifyAll  Condition的await,asignalAll实现,还可以使用同步队列实现,在BlockingQueue接口提供了这个队列,有LinkedBlockingQueue(链表),也有ArrayBlockingQueue(数组)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值