Java锁深入理解1——概述及总结

前言

本来是想只写一篇博客,讲清楚Java锁的。但没想到,越写越多,写完发现有两万多字。这么长的博客,谁看啊,所以拆成了五篇博客。
这是第一篇。包括:Java锁的总体概念,其他篇相关博客的链接,最后的结论,以及写这篇博客参考的一些其他文章以源码资料。

概述

为了尽可能榨取CPU的性能。计算机应用了多线程,多级缓存,指令重排。这些技术提高了计算机性能,同时也带来了数据不一致的问题。

锁的概念应运而生。就是让多线程在不该并发执行的时候,改为同步顺序执行。

机制很简单:只有一把锁,哪个线程抢到锁,哪个线程就可以运行,否则就停下来等着。这就是“互斥”的概念。
由于可以让线程停下来,锁还衍生出了一些其他同步工具,让线程按照我们设想的逻辑流程启停运行。

我们平时虽然说抢锁,但这只是一种表述习惯。如果要准确的说,应该说是”抢钥匙“。而”锁“的概念是编程语言背后的机制来控制的:看你手里有钥匙,就让你运行,否则就让你停止。
当然,无论怎么比喻,其实都无法完全一一对应到日常生活的概念,只能说类似。所以我们还是需要深入剖析一下Java编程语言实现的锁到底是个什么机制。
后面的文章,我会详细剖析一下ReentrantLock的内部实现机制。
有了这个基础,我们再看其他锁同步工具就会容易很多。

锁的分类

Java锁深入理解1——概述及总结_第1张图片

功能分类

排他锁,共享锁,读写锁,公平锁,非公平锁,自旋锁,偏向锁,轻量级锁,重量级锁。这些可能是我们听说过的一些概念。

具体实现

一种是Synchronized,作为java修饰符,由JVM实现。我们就暂且叫它JVM锁吧。

另一种如Lock类,由JDK实现。核心类是AbstractQueuedSynchronizer(简称AQS)。我们就叫它JDK锁吧。

下面是Java给我们的具体实现
Java锁深入理解1——概述及总结_第2张图片

ReentrantLock

Java锁深入理解2——ReentrantLock

synchronized

Java锁深入理解3——synchronized

ReentrantLock VS synchronized

Java锁深入理解4——ReentrantLock VS synchronized

共享锁

Java锁深入理解5——共享锁

总结

  • Java给我们提供了两类锁同步器。一种是关键字形式的synchronized,一种是Java类。
  • 主要就是两种锁:排他锁和共享锁。以及衍生的一些同步器工具(wait/notify)
  • 在这两种主要锁的基础上还细分了公平锁,非公平锁。而synchronized只实现了非公平锁。
  • 以上所说的基本都可以归为“重量级锁”。而synchronized为了性能,进一步增加了偏向锁,轻量级锁。以及锁升级机制。
  • 虽然在实现上并没有纯粹的自旋锁,但他们都应用了自旋机制。(一次不行多试几次,反正尽量不直接使用park这样的信号量,来进行用户态/核心态的切换,减少系统开销)
  • 自旋机制又依赖CAS无锁操作。
  • 无论是重量级锁还是衍生同步工具,最底层都使用了park/unpark来完成线程的停/启。
  • Java类锁的核心类是AbstractQueuedSynchronizer(AQS),其中核心有两个东西:volatile state和同步队列。
  • Java类锁和synchronized都是管程模型的实现,所以实现逻辑基本一样(除了synchronized后来增加的偏向锁和轻量级锁)

怎么在IDEA上debug多线程

单线程的debug我知道。但多线程调试,可能有些人还没尝试过。操作其实也很简单

  • 先随便打个断点,让你的多线程demo用debug模式运行起来,然后停在你的断点出

  • 然后点这个按钮
    Java锁深入理解1——概述及总结_第3张图片

  • 弹出这个界面
    Java锁深入理解1——概述及总结_第4张图片

  • 界面中有两个单选按钮。选择Thread,保存。把断点打在子线程会经过的地方,然后重新debug启动。
    Java锁深入理解1——概述及总结_第5张图片
    在左下角Debugger下拉框里,就可以找到自己线程了。
    你可以通过切换下拉框里的线程,来逐个推进每一个线程的运行进度。(注意每个线程的状态,当现场阻塞时,就无法继续运行了。然后你可以换另一个线程继续推进)

参考

下面是我写这5篇博客参考的资料

IDEA多线程Debug
idea以任意顺序debug多线程程序
AbstractQueuedSynchronizer(AQS)源码分析
AbstractQueuedSynchronizer源码深度解析
Synchronized的底层实现原理
浅谈AQS同步队列
Synchronized的底层实现原理
为了带你精通 Java AQS,我画了 40 张图,从管程模型讲起!
Synchronized升级成重量级锁之后就下不来了?你错了!
关于 Synchronized 的一个点,网上99%的文章都错了
深入浅出理解Java并发AQS的共享锁模式
ReentrantReadWriteLock读写锁详解
带你掌握不同平台下,探索JDK源码所需的native方法
JVM源码位置(本次分析的几个文件都在这个目录)

你可能感兴趣的:(java,java,锁)