美文网首页
带你搞懂Java多线程(四)

带你搞懂Java多线程(四)

作者: 爺珍爱那颗心 | 来源:发表于2020-01-04 21:33 被阅读0次

带你搞懂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();

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

相关文章

  • 带你搞懂Java多线程(五)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三)带你搞懂Java多线程(四) ...

  • 带你搞懂Java多线程(六)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三)带你搞懂Java多线程(四)带...

  • 带你搞懂Java多线程(四)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三) 什么是线程间的协作 线程之间...

  • 带你搞懂Java多线程(三)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二) 什么是线程间的共享 Java支持多个线程同时访问一个对象...

  • 带你搞懂Java多线程(二)

    带你搞懂Java多线程(一) Java里的线程 Java里的程序天生就是多线程的 启动线程的方式 ①扩展Threa...

  • 带你搞懂Java多线程(一)

    什么是多线程 多线程也叫并发编程,那么在写多线程之前,我们先来了解一下并发编程的基础概念。①CPU核心数和线程数的...

  • 线程、多线程和线程池,看完这些你就能全部搞懂了

    摘要:一文带你搞懂线程、多线程和线程池。 本文分享自华为云社区《一文搞懂线程与线程池[https://bbs.hu...

  • 带你搞懂Java反射

    什么是反射 在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应方法。 反射的缺点 因为反...

  • 带你搞懂Java线程池

    什么是线程池 把线程进行池化,调用的时候直接去池里面去取,而不是每次去重新创建,不用的时候放回线程池,而不是直接销...

  • 带你搞懂Java泛型

    什么是泛型 参数化的类型:将需要传入的属性,进行参数化,实际调用时才指定传入的数据类型。 为什么要用泛型 同样的一...

网友评论

      本文标题:带你搞懂Java多线程(四)

      本文链接:https://www.haomeiwen.com/subject/uuytactx.html