MySQL中死锁相关的问题

死锁

  1. 概念:当A事务拥有锁1需要锁2,同时B事务拥有锁2需要锁1的时候,两个线程就进入了天荒地老的循环等待,这就是死锁。

  2. 预防死锁:两种办法

    1. 设定锁等待时间:如果超过一定时间没有获取到锁就暂时放弃,然后回滚,此时会自动释放当前事务持有的锁
    2. 被锁时发起死锁检测:当一个线程被锁的时候就要找到他正在等待释放锁的线程,再递归着去找这个线程等待的线程,如果发现环就证明死锁了,那该回退就回退、该释放就释放。死锁检测还是挺耗时的,如果是简单的两个事务成环那两下就判断出来了,但一般没死锁要递归判断很多次,几乎是个O(n)的操作,这导致死锁检测占用很多CPU资源,虽然没死锁了但是事务又处理不了几个。
  3. 场景题:怎么解决热点行更新导致的性能问题?三个办法

    1. 关掉死锁检测:如果你能确保这个业务一定不会出现死锁,可以临时关闭死锁检测
    2. 控制并发度:控制更新同一行的线程的数量,降低死锁检测的成本
    3. 一个数据行改成逻辑上的多个数据行来减少锁冲突。比如银行账户余额这一行记录,可以分成10行记录的和,冲突概率就减小为 1/10,降低发生冲突的线程数,降低死锁检测的成本。
  4. 写一个死锁的例子

public class DeadLock implements Runnable{
    private static final Object lock1=new Object();
    private static final Object lock2=new Object();
    private int flag;

    public DeadLock(int flag) {
        this.flag = flag;
    }

    @Override
    public void run() {
        if(flag==1)
        {
            synchronized (lock1)
            {
                System.out.println(Thread.currentThread().getName()+"获取lock1并希望获得lock2");
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock2)
                {
                    System.out.println(Thread.currentThread().getName()+"获取lock2");
                }
            }
        }
        else
        {
            synchronized (lock2)
            {
                System.out.println(Thread.currentThread().getName()+"获取lock2并希望获得lock1");
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock1)
                {
                    System.out.println(Thread.currentThread().getName()+"获取lock1");
                }
            }
        }
    }

    public static void main(String [] args){
        DeadLock d1=new DeadLock(0);
        DeadLock d2=new DeadLock(1);
        Thread t1=new Thread(d1);
        Thread t2=new Thread(d2);
//        t1.run();
//        t2.run();
//        不可以用run(),因为run()会等待线程执行完才能执行下一个线程,不是并发的
        t1.start();
        t2.start();
    }
//输出结果
//Thread-0获取lock2并希望获得lock1
//Thread-1获取lock1并希望获得lock2
}
#Java开发##春招##实习##笔试题目##MySQL##学习路径##后端开发#
全部评论
写的挺好的
点赞 回复 分享
发布于 2022-03-20 18:31
欢迎关注公众号「编程学习指南」回复「面试」获取实习生招聘笔试面试面经全套资料(含优秀简历模板、笔试题、面试题、面经)!并且提供免费简历修改服务!以及内推!
点赞 回复 分享
发布于 2022-03-20 18:31
感谢楼主对死锁的讲解!
点赞 回复 分享
发布于 2022-03-13 01:09

相关推荐

零实习能进大厂的核心原因是用其他高价值经历替代了实习,且精准匹配岗位需求,大厂招人看的是能力和潜力,而非单纯的实习经历,这类求职者大多踩中了这几个关键点:1. 校园经历/项目经历拉满,有可落地的成果比如牵头校级/省级竞赛(互联网+、大创等)、做过和岗位强相关的独立项目(新媒体运营做过爆款账号、技术岗做过可演示的项目、产品岗写过完整竞品分析+产品方案),且能清晰讲出自己的角色、解决的问题、拿到的结果(如账号涨粉X万、项目落地后效率提升X%),这类经历比“打杂式实习”更能证明能力。2. 学历/专业硬,匹配大厂核心校招目标头部985/211/海外名校的核心专业(如技术岗的计算机、算法岗的数学/统计,运营岗的新闻传播/市场营销),大厂校招会给这类院校“简历直通笔试/面试”的机会,学历背书能抵消实习的缺失,尤其校招对应届生的实习包容度远高于社招。3. 技能与岗位高度匹配,有硬核证书/作品手握岗位刚需技能(如新媒体岗会剪辑/排版/数据分析、设计岗有完整作品集、财务岗有CPA/初级会计),且能直接拿出成品/证书佐证,比如投运营岗附自己做的推文/短视频合集,投设计岗附作品集,比空有实习经历更有说服力。4. 校招渠道+面试表现加分走大厂提前批/内推/夏令营渠道,简历筛选更宽松;面试时能精准理解岗位需求,把自己的经历和岗位能力点对应(如面试官问“怎么做用户增长”,能结合自己的项目讲具体方法),逻辑清晰、表达流畅,能让面试官看到“可培养的潜力”。5. 抓住大厂的“无实习友好”机会比如大厂的管培生项目、应届生专属校招岗,这类岗位更看重综合能力(学习能力、沟通能力、抗压能力),而非实习经历;还有部分大厂的“补录/春招”,因招聘需求紧急,会降低实习的要求,更看重匹配度。简单说,实习只是证明能力的其中一种方式,不是唯一方式。零实习想进大厂,核心是找到自己的高价值经历,把它包装成和岗位匹配的能力证明,让面试官相信“你能快速上手工作”。
为什么有人零实习也能进大...
点赞 评论 收藏
分享
评论
7
77
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务