线程-锁
文章目录
前言
在并发中,锁是不可缺少的一部分,在很多场景中,我们想要保证安全,锁总是我们的第一选择。于是系统的学习一下,做了个读书笔记。
提示:以下是本篇文章正文内容
一、锁的类型有哪些?
细细一看锁的类型还真是多。
二、锁的原理
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. 没有理清楚线程安全的问题所在,导致锁无效
2. 加锁没有考虑锁的粒度,可能导致性能问题
3. 多把锁格外小心死锁问题
总结
以上就是今天要讲的内容,本文仅仅简单介绍了锁,以及锁的原理,死锁的问题,生产中遇到的问题。
并发大师 Doug Lea《Java 并发编程:设计原则与模式》一书中,推荐的三个用锁的最佳实践
- 永远只在更新对象的成员变量时加锁
- 永远只在访问可变的成员变量时加锁
- 永远不在调用其他对象的方法时加锁