首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

带你搞懂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也叫线程隔离 用法如下:

代码语言:javascript
复制
//定义变量
new ThreadLocal<参数化类型>(){
  @Override
  protected 参数化类型 initialValue(){
    return 值;
  }
}
//取变量
threadLocal.get();
//存变量
threadLocal.set(值);
//删除值
threadLocal.remove();

从而避免了线程间共享造成的错误。

下一篇
举报
领券