1、死锁
①什么是死锁?
双方因为互相等待对方的资源而进入了循环等待的过程
②产生死锁的条件?
1、环路等待
2、持有并等待
3、互斥
4、不剥夺
必须满足以上4个条件,才会产生死锁
④示例代码
public static void main(String[] args) { new T1().start(); new T2().start(); } static class T1 extends Thread { @Override public void run() { a(); } public void a() { while (true) { synchronized (T1.class) { synchronized (T2.class) { System.out.println("a"); } } } } } static class T2 extends Thread { @Override public void run() { b(); } public void b() { while (true) { synchronized (T2.class) { synchronized (T1.class) { System.out.println("b"); } } } } }
解释:
互斥:T1和T2存在锁互斥条件
环路等待及持有并等待:T1持有T1锁,等待T2锁;T2持有T2锁,等待T1锁。
操作系统的不剥夺~~
⑤死锁的检测工具
jconsole // 可直接检测死锁 jstack // 查看线程堆栈信息
⑥死锁的解决方法
1、同样的加锁顺序
2、加锁限时,例如使用Lock
2、线程饥饿
①什么是线程饥饿?
线程饥饿是指线程得不到运行
②为什么会产生线程饥饿?
1、高优先级线程抢占低优先级线程的CPU时间片,导致低优先级线程无法执行
2、线程被永久阻塞在等待进入同步块的状态,其他线程总是能在该线程之前持续对该同步块进行访问
③解决方案
1、避免使用优先级
2、使用公平锁
3、活锁
活锁不会阻塞线程,但是线程不能继续执行。因为线程一直在执行重复的操作,但是总会丢失。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/76680.html
摘要:和方法用来设置线程是否成为守护线程和判断线程是否是守护线程。守护线程依赖于创建它的线程,随它的消亡而消亡。使用提供的方法,提醒线程终止,但是否真正终止由线程自己决定。参考实战高并发程序设计多线程干货系列一多线程基础 一、如何创建多线程 1、继承Thread类 public class MyThread extends Thread { @Override public ...
摘要:本文探讨并发中的其它问题线程安全可见性活跃性等等。当闭锁到达结束状态时,门打开并允许所有线程通过。在从返回时被叫醒时,线程被放入锁池,与其他线程竞争重新获得锁。 本文探讨Java并发中的其它问题:线程安全、可见性、活跃性等等。 在行文之前,我想先推荐以下两份资料,质量很高:极客学院-Java并发编程读书笔记-《Java并发编程实战》 线程安全 《Java并发编程实战》中提到了太多的术语...
摘要:将与当前线程建立一对一关系的值移除。为了让方法里的操作具有原子性,也就是在一个线程执行这一系列操作的同时禁止其他线程执行这些操作,提出了锁的概念。 上头一直在说以线程为基础的并发编程的好处了,什么提高处理器利用率啦,简化编程模型啦。但是砖家们还是认为并发编程是程序开发中最不可捉摸、最诡异、最扯犊子、最麻烦、最恶心、最心烦、最容易出错、最不符合社会主义核心价值观的一个部分~ 造成这么多最...
摘要:发布的对象内部状态可能会破坏封装性,使程序难以维持不变性条件。不变性线程安全性是不可变对象的固有属性之一。可变对象必须通过安全方式来发布,并且必须是线程安全的或者有某个锁保护起来。 线程的优缺点 线程是系统调度的基本单位。线程如果使用得当,可以有效地降低程序的开发和维护等成本,同时提升复杂应用程序的性能。多线程程序可以通过提高处理器资源的利用率来提升系统的吞吐率。与此同时,在线程的使用...
阅读 2018·2023-04-25 15:11
阅读 3395·2021-09-23 11:57
阅读 1350·2021-07-26 23:38
阅读 1302·2019-08-30 15:54
阅读 616·2019-08-30 15:53
阅读 3229·2019-08-26 13:36
阅读 957·2019-08-26 12:01
阅读 2834·2019-08-23 16:21