带你搞懂Java多线程(一)
带你搞懂Java多线程(二)
带你搞懂Java多线程(三)
什么是线程间的协作
- 线程之间相互配合完成某项工作
等待和通知
- wait()
- notify/notifyAll
这两个方法都是Object带的,wait让当前线程进行等待,notify通知一个线程取消等待,notifyAll通知所有线程取消等待。
标准范式
等待方:
1.获取对象的锁。
2.检查条件,条件不满足wait
3.条件满足,执行业务代码
syn(对象){
while(条件不满足){
对象.wait();
}
执行业务代码
}
通知方:
1.获取对象的锁。
2.修改条件
3.通知等待方
syn(对象){
执行业务代码,修改条件
对象.notify()/notifyAll();
}
wait会释当前线程所持有的锁,而notify/notify是执行完syn代码块才释放锁
yield()和sleep()是不会释放当前线程所持有的锁
- 在一般情况下,应该尽量用notifyAll
- 因为notify只会唤醒一个线程
- notify唤醒的线程不一定是应该唤醒的那个线程
ThreadLocal的使用
变量如果不是每个线程所独有会造成,结果不正确。
ThreadLocal也叫线程隔离
用法如下:
//定义变量
new ThreadLocal<参数化类型>(){
@Override
protected 参数化类型 initialValue(){
return 值;
}
}
//取变量
threadLocal.get();
//存变量
threadLocal.set(值);
//删除值
threadLocal.remove();
从而避免了线程间共享造成的错误。
网友评论