美文网首页
java基础知识9-并发

java基础知识9-并发

作者: liwsh | 来源:发表于2021-05-07 17:43 被阅读0次

1. synchronize

1.1 Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高
1.2 JDK1.6以后,为了减少获得锁和释放锁所带来的性能消耗,提高性能,引入了“轻量级锁”和“偏向锁”
1.3 JDK 1.6中默认是开启偏向锁和轻量级锁的,我们也可以通过-XX:-UseBiasedLocking来禁用偏向锁。锁的状态保存在对象的头文件中
1.4 偏向锁:当一个线程访问同步代码块并获取锁时,会在Mark Word里存储锁偏向的线程ID。在线程进入和退出同步块时不再通过CAS操作来加锁和解锁引入偏向锁是为了在无多线程竞争的情况下尽量减少不必要的轻量级锁执行路径,因为轻量级锁的获取及释放依赖多次CAS原子指令,而偏向锁只需要在置换ThreadID的时候依赖一次CAS原子指令即可。
1.5 偏向锁释放:偏向锁只有遇到其他线程尝试竞争偏向锁时,持有偏向锁的线程才会释放锁,线程不会主动释放偏向锁。偏向锁的撤销,需要等待全局安全点(在这个时间点上没有字节码正在执行),它会首先暂停拥有偏向锁的线程,判断锁对象是否处于被锁定状态。
1.6 轻量级锁:是指当锁是偏向锁的时候,被另外的线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,从而提高性能。
1.7 若当前只有一个等待线程,则该线程通过自旋进行等待。但是当自旋超过一定的次数,或者一个线程在持有锁,一个在自旋,又有第三个来访时,轻量级锁升级为重量级锁。
1.8 总结:偏向锁通过对比Mark Word解决加锁问题,避免执行CAS操作。而轻量级锁是通过用CAS操作和自旋来解决加锁问题,避免线程阻塞和唤醒而影响性能。重量级锁是将除了拥有锁的线程以外的线程都阻塞。
1.9 synchrnize原理:https://blog.csdn.net/xue_mind/article/details/123752649

2. 偏向锁,轻量级锁,重量级锁转换

image.png

3. 各类锁优缺点

image.png

4.volitale

4.1 保证可见性:可见性是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果,另一个线程马上就能看到。
4.2 双重校验锁实现单例需要volitale修饰,确保指令不重排
4.3happens-before的概念来阐述操作之间的内存可见性。在JMM中,如果一个操作执行的结果需要对另一个操作可见,以这两个操作之间必须要有happens-before关系。这里提到的两个操作,既可以是在一个线程之内,也可以是在不同的线程之间。参考:https://www.cnblogs.com/kingsleylam/p/8698681.html

5. CAS

5.1 CAS是乐观锁,保证单一变量修改的原子性。变量是volite修饰,保证始终可以看到最新的修改。
5.2 缺点 1.ABA,增加版本信息。2.多次循环开销大
5.3 LongAdder 适合于高并发场景下,特别是写大于读的场景,相较于 AtomicInteger、AtomicLong 性能更好,代价是消耗更多的空间,以空间换时间。具体参考:https://zhuanlan.zhihu.com/p/94762520

6. ReentrantLock 与synchronize的区别

image.png

相关文章

  • java基础知识9-并发

    1. synchronize 1.1 Synchronized是通过对象内部的一个叫做监视器锁(monitor)来...

  • Java并发编程学习总结

    Java 并发基础知识 Java 并发的基础知识,可能会在笔试中遇到,技术面试中也可能以并发知识环节提问的第一个问...

  • Java并发之AQS原理

    本文是Java并发专题(欢迎大家关注)的一篇。以下是完整的目录:Java并发之基础知识Java并发之volatil...

  • 记录一些书籍

    JAVA 基础 《Java核心技术·卷1:基础知识》《Java核心技术 卷2:高级特性》《Java8 实战》 并发...

  • Java学习

    Java 基础知识点 基础语法 多线程 并发 IO、NIO 集合框架 网络 RMI SQL 上图来自Java 征途...

  • Java并发编程之美系列汇总

    Java并发编程之美系列汇总,大家可以挑选自己感兴趣的的进行订阅。 Java 并发编程之美:线程相关的基础知识ht...

  • java知识点

    66主要包括以下几个部分: Java 基础知识点 Java 常见集合 高并发编程(JUC 包) JVM 内存管理 ...

  • 《java并发编程实战》第四章:设计线程安全的类

    前面德章节主要介绍java一些底层基础的并发实现机制和java的一些并发基础知识,本章节主要是用上述的这些知识来构...

  • Java多线程与并发编程在面试中的超高频题!

    Java多线程与并发编程高频问题 《[Java面试必知必会]》系列已经更新两章了,Java基础知识面试高频考点和J...

  • 并发编程-进程和线程的由来

    前提:有了解过操作系统的基础知识 Java并发编程。当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够...

网友评论

      本文标题:java基础知识9-并发

      本文链接:https://www.haomeiwen.com/subject/zjjnrltx.html