等待方:
1.获取对象的锁。
2.检查条件,条件不满足wait
3.条件满足,执行业务代码
syn(对象){
while(条件不满足){
对象.wait();
}
执行业务代码
}
通知方:
1.获取对象的锁。
2.修改条件
3.通知等待方
syn(对象){
执行业务代码,修改条件
对象.notify()/notifyAll();
}
wait会释当前线程所持有的锁,而notify/notify是执行完syn代码块才释放锁
yield()和sleep()是不会释放当前线程所持有的锁
变量如果不是每个线程所独有会造成,结果不正确。 ThreadLocal也叫线程隔离 用法如下:
//定义变量
new ThreadLocal<参数化类型>(){
@Override
protected 参数化类型 initialValue(){
return 值;
}
}
//取变量
threadLocal.get();
//存变量
threadLocal.set(值);
//删除值
threadLocal.remove();
从而避免了线程间共享造成的错误。