首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第一章:相关概念
1.1 并发和并行
1.2 进程和线程
1.3 线程调度
1.4 多线程的应用场景
第二章:线程的创建和使用
2.1 概述
2.1 JDK 5之前创建线程的方式
2.1.1 概述
2.1.2 继承 Thread 类
2.1.3 实现 Runnable 接口
2.1.4 继承方式和实现方式的区别
2.2 设置线程名称和获取线程名称
2.3 线程的优先级
第三章:线程安全
3.1 售票程序引出线程安全
3.2 线程安全的原因
3.3 线程安全的解决方法
3.4 JDK 5 之前解决线程安全
3.4.1 概述
3.4.2 同步机制的原理
3.4.3 同步机制中的锁
3.4.4 应用示例
3.5 JDK 5 之后解决线程安全
3.6 死锁
3.7 synchronized 与 Lock 的对比
第四章:线程通信
4.1 为什么需要线程通信?
4.2 等待唤醒机制
4.3 生产者和消费者问题
4.4 sleep() 和 wait() 方法的区别
4.5 生产者和消费者性能问题
4.6 Lock 接口的深入
第五章:单例设计模式
5.1 概述
5.2 单例模式
第六章:线程池
6.1 概述
6.2 线程池相关的API
6.3 实现 Callable 接口
6.4 ThreadPoolExecutor
第七章:线程的生命周期
第八章:volatile 关键字
8.1 概述
8.2 应用示例
第九章:原子性
9.1 概述
9.2 AtomicInteger
9.2.1 常用方法
9.2.2 原理
9.2.3 源码解析
9.3 synchronized 和 CAS 的区别
第十章:并发工具类
10.1 Hashtable
10.2 ConcurrentHashMap
10.3 CountDownLatch
10.4 Semaphore
当前位置:
首页>>
技术小册>>
Java语言基础8-Java多线程
小册名称:Java语言基础8-Java多线程
- 死锁: - 不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁。 - 出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处于阻塞状态,无法继续。 - 解决方法: - 专门的算法、原则。 - 尽量减少同步资源的定义。 - 尽量避免嵌套同步。 产生死锁的的四个条件如下: - ① 互斥条件:一个资源每次只能被一个进程使用; - ② 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放; - ③ 不剥夺条件:进程已获得的资源,在没使用完之前,不能强行剥夺; - ④ 循环等待条件:多个进程之间形成一种互相循环等待资源的关系。 - 示例:死锁 ```bash package com.github.thread.demo12; /** * @author maxiaoke.com * @version 1.0 * */ public class LockA { public static final LockA LOCK_A = new LockA(); } ``` ```bash package com.github.thread.demo12; /** * @author maxiaoke.com * @version 1.0 * */ public class LockB { public static final LockB LOCK_B = new LockB(); } ``` ```bash package com.github.thread.demo12; /** * 实现死锁程序 * * @author maxiaoke.com * @version 1.0 * */ public class ThreadDeadLock implements Runnable { private final boolean flag; public ThreadDeadLock(boolean flag) { this.flag = flag; } @Override public void run() { while (true) { if (this.flag) { // 先进入A锁同步 synchronized (LockA.LOCK_A) { System.out.println("线程获取A锁"); // 再进入B锁同步 synchronized (LockB.LOCK_B) { System.out.println("线程获取B锁"); } } } else { // 先进入B锁同步 synchronized (LockB.LOCK_B) { System.out.println("进入B"); // 再进入A锁同步 synchronized (LockA.LOCK_A) { System.out.println("进入A"); } } } } } } ``` ```bash package com.github.thread.demo12; /** * @author maxiaoke.com * @version 1.0 * */ public class Test { public static void main(String[] args) { ThreadDeadLock deadLock1 = new ThreadDeadLock(false); ThreadDeadLock deadLock2 = new ThreadDeadLock(true); Thread t1 = new Thread(deadLock1); Thread t2 = new Thread(deadLock2); t1.start(); t2.start(); } } ```
上一篇:
3.5 JDK 5 之后解决线程安全
下一篇:
3.7 synchronized 与 Lock 的对比
该分类下的相关小册推荐:
Java必知必会-Maven初级
SpringBoot合辑-高级篇
SpringBoot合辑-初级篇
Java语言基础3-流程控制
Mybatis合辑4-Mybatis缓存机制
Java语言基础7-Java中的异常
Java高并发秒杀入门与实战
深入理解Java虚拟机
JAVA 函数式编程入门与实践
Java语言基础16-JDK8 新特性
Java语言基础9-常用API和常见算法
Java语言基础2-运算符