文章目录
死锁的特点与修复策略
- 死锁的特点与修复策略
- 避免策略代码演示
死锁的特点:
- 不可提前预料
- 蔓延速度快
- 危害非常大
发生死锁后, 要保存案发现场, 可以用java相关的命令, 把整个堆栈信息保存下来, 立刻修复线上服务.
利用保存的堆栈信息, 排查死锁, 修改代码. 重新发版.
修复死锁的三个策略 :
- 避免策略 : 哲学家就餐的换手方案, 转账换序方案
- 检测与恢复策略: 一段时间检测是否有死锁, 如果有就剥夺某一个资源, 来打开死锁
- 鸵鸟策略: 比喻鸵鸟遇到危险把头埋地上而看不到危险, 逃避心理. 含义是如果发生死锁的概率极其的低 , 那么就直接忽略它 , 直到发生死锁的时候再修复. (适用于用户量不大的系统,此种做法不推荐)
死锁避免策略 避免相反的获取锁的顺序:
转账时避免死锁的案例: 不在乎获取锁的顺序. 而是避免相反的获取锁的顺序.
package com.thread.deadlock;
/**
* 类名称:TransferMoney
* 类描述: 转账时遇到死锁的代码演示
*
* @author: https://javaweixin6.blog.csdn.net/
* 创建时间:2020/9/8 19:24
* Version 1.0
*/
public class TransferMoney implements Runnable {
//根据不同的flag, 给不同的人转账
int flag = 1;
static Account a = new Account(500);
static Account b = new Account(500);
static Object lock = new Object();
public static void main(String[] args) throws InterruptedException {
TransferMoney r1 = new TransferMoney();
TransferMoney r2 = new TransferMoney();
r1.flag = 1;
r2.flag = 0;
Thread thread1 = new Thread(r1);
Thread thread2 = new Thread(r2);
thread1.start();
thread2.start();
//主线程等待子线程执行完毕
thread1.join();
thread2.join();
System.out.println("a的余额 " + a.balance);
System.out.println("b的余额 " + b.balance);
}
@Override
public void run() {
//flag 是1 则 a 给b钱
if (flag == 1) {
transferMoney(a, b, 200);
}
//flag 是0 则b 给a钱
if (flag == 0) {
transferMoney(b, a, 200);
}
}
/**
* 转账的方法
*
* @param from 转账方
* @param to 收账方
* @param amount 金额
*/
public static void transferMoney(Account from, Account to, int amount) {
class Helper {
public void transfer() {
//转账前判断余额是否充足
if (from.balance - amount
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?