线程Thread

2018-03-14  本文已影响0人  天探女

线程

创建线程的4种方式

  1. 继承Thread类
  2. 实现Runnable接口
  3. 使用Execute框架创建线程池
  4. 实现Callable接口

线程的5中状态

  1. 新建(new):新建线程对象
  2. 可运行(runnable):线程对象创建后,其他线程调用了该线程的start()方法。该状态的线程位于可运行的线程池中,等待被线程调度选中,获取CPU使用权
  3. 运行(running):可运行状态的线程获得cpu时间片,执行程序代码
  4. 阻塞(block):线程因为某种原因放弃cpu的使用权,让出cpu时间片,暂时停止运行。直到线程进入可运行状态。
    1. 等待阻塞:运行 线程执行了wait()方法,jvm会把线程放入等待队列
    2. 同步阻塞:运行 线程获取对象同步锁的时候,该锁被其他线程占用,则jvm会把该线程放入锁池
    3. 其他阻塞:运行 线程执行sleep方法或join方法,或发出I/O请求时,jvm会把该线程置为阻塞状态
  5. 死亡(dead):线程的run()方法执行结束,或因为异常退出run()方法。

同步方法和同步代码块的区别

同步方法默认用this或者当前类class对象作为锁;

同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法;

同步方法使用关键字 synchronized修饰方法,而同步代码块主要是修饰需要进行同步的代码,用 synchronized(object){代码内容}进行修饰;

在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步

监视器和锁在Java虚拟机中是一块使用的。

监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。

每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。

死锁(deadlock)

指多个进 程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进

死锁产生的4个必要条件:

互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。

不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。

请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。

循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被 链中下一个进程所请求。

典型的生产消费问题

上一篇 下一篇

猜你喜欢

热点阅读