• 线程的声明周期


    状态说明:

    1.new:新建状态,线程对象被创建时。

    2.runnable:就绪态,调用该线程的start方法。

    3.running:执行态,线程获得了cpu执行权。

    4.blocked:阻塞态,线程放弃cpu执行权,暂时停止运行,直到某种条件满足重新进入就绪状态。

    阻塞态分三种:

    (1):等待阻塞,调用线程的wait方法,让线程等待某工作完成

    (2):同步阻塞,线程在获取synchronized同步锁失败

    (3):其他阻塞,调用线程的sleep,join方法或发出了i/o请求

    5.dead:死亡,线程执行完毕,或退出run方法,结束了线程的声明周期。

    锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入对象的synchronized方法之前必须先获得该对象的锁的拥有权,但是该对象的锁目前正被线程A拥有,所以这些线程就进入了该对象的锁池中。

    等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁后,进入到了该对象的等待池中

    notify和notifyAll的区别

    • 如果线程调用了对象的 wait()方法,那么线程便会处于该对象的等待池中,等待池中的线程不会去竞争该对象的锁
    • 当有线程调用了对象的 notifyAll()方法(唤醒所有 wait 线程)或 notify()方法(只随机唤醒一个 wait 线程),被唤醒的的线程便会进入该对象的锁池中,锁池中的线程会去竞争该对象锁。也就是说,调用了notify后只要一个线程会由等待池进入锁池,而notifyAll会将该对象等待池内的所有线程移动到锁池中,等待锁竞争
    • 优先级高的线程竞争到对象锁的概率大,假若某线程没有竞争到该对象锁,它还会留在锁池中,唯有线程再次调用 wait()方法,它才会重新回到等待池中。而竞争到对象锁的线程则继续往下执行,直到执行完了 synchronized 代码块,它会释放掉该对象锁,这时锁池中的线程会继续竞争该对象锁。



    参考:
    https://www.zhihu.com/question/37601861/answer/145545371
    https://blog.csdn.net/cloudeagle_bupt/article/details/21378283
     
  • 相关阅读:
    Ruby
    WebGL的第二个小程序
    wegGL的第一个小程序
    Node.js介绍
    接口隔离原则(Interface Sepreation Principle)
    参数
    字段/属性
    接口和抽象类
    javascript中的事件
    线性回归算法-4.多元线性回归算法
  • 原文地址:https://www.cnblogs.com/chinano1/p/10015831.html
Copyright © 2020-2023  润新知