线程
创建线程的4种方式
- 继承Thread类
- 实现Runnable接口
- 使用Execute框架创建线程池
- 实现Callable接口
线程的5中状态
- 新建(new):新建线程对象
- 可运行(runnable):线程对象创建后,其他线程调用了该线程的start()方法。该状态的线程位于可运行的线程池中,等待被线程调度选中,获取CPU使用权
- 运行(running):可运行状态的线程获得cpu时间片,执行程序代码
- 阻塞(block):线程因为某种原因放弃cpu的使用权,让出cpu时间片,暂时停止运行。直到线程进入可运行状态。
- 等待阻塞:运行 线程执行了wait()方法,jvm会把线程放入等待队列
- 同步阻塞:运行 线程获取对象同步锁的时候,该锁被其他线程占用,则jvm会把该线程放入锁池
- 其他阻塞:运行 线程执行sleep方法或join方法,或发出I/O请求时,jvm会把该线程置为阻塞状态
- 死亡(dead):线程的run()方法执行结束,或因为异常退出run()方法。
同步方法和同步代码块的区别
同步方法默认用this或者当前类class对象作为锁;
同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法;
同步方法使用关键字 synchronized修饰方法,而同步代码块主要是修饰需要进行同步的代码,用 synchronized(object){代码内容}进行修饰;
在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步
监视器和锁在Java虚拟机中是一块使用的。
监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。
每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。
死锁(deadlock)
指多个进 程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进
死锁产生的4个必要条件:
互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。
请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被 链中下一个进程所请求。
网友评论