群晖搭建企业网站平面设计常用的软件
2026/1/15 23:58:36 网站建设 项目流程
群晖搭建企业网站,平面设计常用的软件,制作卖东西网站,顺德网站建设咨询01-死锁的概念 死锁是指两个或两个以上的线程在执行过程中#xff0c;因抢夺资源而造成的一种互相等待的现象#xff0c;若无外力干涉#xff0c;则它们无法再继续推进下去 02-产生原因 系统资源不足进程运行推进顺序不合适系统资源分配不当 03-常见死锁场景与示例 3.1 嵌…01-死锁的概念死锁是指两个或两个以上的线程在执行过程中因抢夺资源而造成的一种互相等待的现象若无外力干涉则它们无法再继续推进下去02-产生原因系统资源不足进程运行推进顺序不合适系统资源分配不当03-常见死锁场景与示例3.1嵌套锁顺序不一致public class DeadLockDemo { static Object a new Object(); static Object b new Object(); public static void main(String[] args) { new Thread(() - { synchronized (a){ System.out.println(t1线程持有a锁试图获取b锁); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (b){ System.out.println(t1线程获取到b锁); } } },t1).start(); new Thread(() - { synchronized (b){ System.out.println(t2线程持有a锁试图获取a锁); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (a){ System.out.println(t2线程获取到a锁); } } },t2).start(); } }分析t1线程执行先获取a锁再请求b锁t2线程执行先获取b锁再请求a锁可能形成循环等待3.2动态锁顺序死锁public void transfer(Account from, Account to, int amount) { synchronized (from) { synchronized (to) { from.withdraw(amount); to.deposit(amount); } } }分析如果两个线程同时调用transfer()但参数顺序相反线程Atransfer(account1, account2, 100)线程Btransfer(account2, account1, 200)可能产生死锁3.3资源死锁如线程池任务相互等待ExecutorService executor Executors.newFixedThreadPool(2); Future? future1 executor.submit(() - { Future? future2 executor.submit(() - System.out.println(Task2)); future2.get(); // 等待任务2完成 }); future1.get(); // 等待任务1完成分析线程池只有两个线程任务1提交任务2并等待任务2完成任务2等待线程池空闲若任务2无法执行任务1也无法完成形成死锁04-如何避免死锁4.1 固定锁顺序始终按全局一致顺序获取锁public void transfer(Account a, Account b, int amount) { Object firstLock a.id b.id ? a : b; Object secondLock a.id b.id ? b : a; synchronized (firstLock) { synchronized (secondLock) { // 操作 } } }4.2使用超时机制用tryLock()替代synchronized设置超时时间if (lock1.tryLock(100, TimeUnit.MILLISECONDS)) { try { if (lock2.tryLock(100, TimeUnit.MILLISECONDS)) { try { // 操作 } finally { lock2.unlock(); } } } finally { lock1.unlock(); } }4.3 避免嵌套锁尽量只持有一个锁或 将多个锁封装为一个大锁05-如何排查死锁5.1 纯命令jps -l— 相当于 java ps -ef -l —查看本地系统中所有正在运行的 Java 进程jstack 进程编号—查看进程堆栈信息5.2 图形化jconsole —win R 输入 jconsole连接对应的Java进程点击线程点击检测死锁即可查看

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询