锁 | 原来锁还有这么多种

线程-锁



前言

在并发中,锁是不可缺少的一部分,在很多场景中,我们想要保证安全,锁总是我们的第一选择。于是系统的学习一下,做了个读书笔记。


提示:以下是本篇文章正文内容

一、锁的类型有哪些?

细细一看锁的类型还真是多。
在这里插入图片描述

二、锁的原理

1.AQS

这里也是做一个大概的了解,也把大佬的文章贴上来一起学习。
一行一行源码分析清楚AbstractQueuedSynchronizer

在这里插入图片描述

三、synchronized与Lock的区别

在这里插入图片描述

1.Lock的搭档Conditon

Condition与Lock配合完成等待通知机制,属于语言级别的,具有更高的可控制性和扩展性。
Java SDK 并发包通过 Lock 和 Condition 两个接口来实现管程,其中 Lock 用于解决互斥问题,Condition 用于解决同步问题
在这里插入图片描述

四、死锁了怎么办?

面对死锁,是我们最不想看到的,但是如果发生了改如何处理呢?
在这里插入图片描述
死锁扫描代码,代码中没有考虑细节方面的问题。

ThreadMXBean mbean = ManagementFactory.getThreadMXBean();
        Runnable dlCheck = () -> {
            long[] threadIds = mbean.findDeadlockedThreads();
            if (threadIds != null) {
                ThreadInfo[] threadInfos = mbean.getThreadInfo(threadIds);
                System.out.println("Detected deadlock threads:");
                for (ThreadInfo threadInfo : threadInfos) {
                 System.out.println(threadInfo.getThreadName()+"11111");
                }
            }
        };
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        // 稍等 5 秒,然后每 10 秒进行一次死锁扫描
        scheduler.scheduleAtFixedRate(dlCheck, 5L, 10L, TimeUnit.SECONDS);
        // 死锁样例代码…

五、生产中要注意的问题

1. 没有理清楚线程安全的问题所在,导致锁无效

111

2. 加锁没有考虑锁的粒度,可能导致性能问题

在这里插入图片描述

3. 多把锁格外小心死锁问题

在这里插入图片描述


总结

以上就是今天要讲的内容,本文仅仅简单介绍了锁,以及锁的原理,死锁的问题,生产中遇到的问题。

并发大师 Doug Lea《Java 并发编程:设计原则与模式》一书中,推荐的三个用锁的最佳实践

  • 永远只在更新对象的成员变量时加锁
  • 永远只在访问可变的成员变量时加锁
  • 永远不在调用其他对象的方法时加锁
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值