zoukankan      html  css  js  c++  java
  • 多线程深度剖析

    多线程这块有个非常重要且经典的图例,可以很好的帮助我们理解多线程,搭配API文档,应该可以轻松搞定多线程了。

    如图,调用线程的start方法后,线程进入可运行状态,经过系统调度器决定是否运行,而且两者可以相互转换(Running->Runnable的一种情况是分配给线程的时间片用完了),图像上方是阻塞事件引发线程进入阻塞(不可运行)状态,引起线程阻塞的事件有:调用了sleep方法、线程调用wait方法等待特定条件的满足、线程输入/输出阻塞。左下方是访问对象的synchronized方法时,首先要进入到对象的锁池等待获得对象的所,才能够进入可运行状态,经系统调度运行,而右下方是调用对象的wait方法,wait和notify以及notifyAll均隶属于Object对象,因此任何一个对象都用这些方法,而三者又都是final的,因此该方法不能被重写,也就是说,你不能通过继承来改变其行为,阅读API文档可以知道,调用wait方法的前提是已经获得对象的锁了(也就是wait方法的调用要在synchronized方法或者synchronized块里),并且调用完wait后,该线程释放掉对象的锁,进入对象锁的等待池中,直到有notify通知他,他才会醒来进入对象的锁池里,等待获得对象的锁,一旦获得对象的锁后,便进入可运行状态。

    另外,需要注意的一点是,调用线程的sleep方法,线程在睡眠的过程中并不会释放掉对象的锁。

  • 相关阅读:
    Ubuntu创建VLAN接口配置
    Ubuntu配置网桥方法
    Ubuntu重启网卡的三种方法
    kvm存储池和存储卷
    ubuntu如何切换到root用户
    修改Ubuntu默认apt下载源
    Java之泛型<T> T与T的用法(转载)
    Java关键字(一)——instanceof(转载)-BeanCopier相关
    java代码之美(12)---CollectionUtils工具类(转载)
    Lombok-注解@Slf4j的使用
  • 原文地址:https://www.cnblogs.com/Code-Rush/p/4625144.html
Copyright © 2011-2022 走看看