Wait/NotifyAll标准使用
等待方线程
1.获取对象锁
2.判断条件
代码写法
sync(对象){
while(条件){
wait();//线程在此处等待,唤醒后继续执行后续方法doFun();
doFun();//唤醒的后续操作
}
}
修改方线程
1.获取对象锁
2.修改判断条件
代码写法
sync(对象){
//修改条件后
notifyAll();//通知所以线程继续执行
}
锁的特性/分类
- 公平、非公平锁
- 可重入锁
- 排他、非排他锁
Synchronized 内部锁(虚拟机实现)
- 锁的是对象实例
- 可重入锁
- 非公平锁
Lock:显示锁(代码实现)
- ReentrantLock:普通可重入锁(支出公平和非公平锁)
Lock lock = new ReentrantLock(true/false)
1.一定要用try/finally包裹
public void work(){
lock.lock();
try{
//do work
}finally{
lock.unlock();
}
}
- ReadWriteLock:读写锁 频率->读:写=>10:1
1.读非排他锁,写排他锁
ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
Lock readLock = readWriteLock.readLock();//读线程
Lock writeLock = readWriteLock.writeLock();//写线程
2.ReentrantReadWriteLock 高效读,写安全
网友评论