首页 > 编程语言 >Java多线程(6):锁与AQS(上)

Java多线程(6):锁与AQS(上)

时间:2022-10-29 09:44:05浏览次数:52  
标签:重入 Java synchronized AQS 线程 自旋 多线程 轻量级

您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~

 

在Java面试中,有一类高频问题会经常问到(火箭式问题):Java有几种锁?都是干嘛的?我想对于面试经验较为丰富的人,这个问题极有可能遇到过。不过我估计除了「死锁」大部分人都听过以外,其他的什么锁可能就不是那么清楚了。实际上,Java总共有6大类14种锁(不同的人对锁的理解不同,可能分类和数量会不太一样,这个无关紧要):

 

 

与锁相关的类继承结构:

 

 

首先,是悲观锁和乐观锁。

1、悲观锁:包括synchronized关键字和Lock类,适合写操作多的场景

2、乐观锁:包括CAS算法和原子类,适合读操作多的场景

悲观锁与乐观锁的处理方式比较:

 

  

悲观锁与乐观锁的调用方式:

 

 

 

接着,是自旋锁和适应性自旋锁。

自旋锁,一种无需切换线程状态就能检查是否能持有资源的锁,它的流程图是:

 

 

 

所谓自旋锁,其实就是我们经常在代码中看到的:

for(;;) {

    ......

}

注意:while...do底层调用的也是for(;;)

关于自旋锁有如下事实:

1、如果锁被占用的时间很短,自旋锁的效果就会很好,反之很差

2、自旋等待的时间必须有限度,如果超过了限定次数就应该挂起

3、限定的默认自旋次数是10次,可以使用JVM参数-XX:PreBlockSpin来更改

4、可以使用JVM参数-XX:+UseSpinning来开启

 

最后,剩下的一些锁,了解就好了,直到这些概念即可。

1、无锁、偏向锁、轻量级锁和重量级锁。

这四种锁是专门针对synchronized关键字的,他们都与Java对象头和Monitor锁有关。synchronized依赖于monitor,而monitor依赖于操作系统底层。

  • 无锁:资源共享,但只有一个线程能成功操作;
  • 偏向锁:一段同步代码一直被某个线程锁获得,JDK6之后默认启用,使用-XX:-UseBiasedLocking=false关闭;
  • 轻量级锁:偏向锁被另外的线程访问时,就会升级为轻量级锁;
  • 重量级锁:轻量级锁的升级。

 

2、公平锁和非公平锁。

  • 公平锁:指的是按照申请锁的顺序,在等待队列中排队来获取锁;
  • 非公平锁:指的是直接尝试获取锁,获取不到才会到等待队列中排队。意思就是插队做了核算。

公平锁注重公平,但缺乏效率。

 

3、可重入锁和非可重入锁。

  • 可重入锁:又叫递归锁,意思是同一个线程在外层方法获取到锁的时候,再进入到内层方法就会自动获取到锁(ReentrantLock和synchronized都是可重入锁);
  • 非可重入锁:进入内层方法时,需要将外层锁释放,但由于线程已在方法中,无法释放,因此极有可能会造成死锁。

 

4、独享锁和共享锁

  • 独享锁:也叫排他锁,只能被一个线程所持有,既能读又能写。
  • 共享锁:可被多个线程持有,但只能读不能写。

独享锁和共享锁是互斥的,通过ReentrantLock和ReentrantReadWriteLock实现。

 

开发中最常见的其实就是悲观锁、乐观锁和自旋锁(尤其在Java源码中出现的很多),理解清楚这几个,其他的都不难懂。

 

 


 

 

感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~

 

标签:重入,Java,synchronized,AQS,线程,自旋,多线程,轻量级
From: https://www.cnblogs.com/xiangwang1111/p/16837800.html

相关文章

  • xxqJava-Blog2
    一、前言(1)题目集四之凸四边形的计算:此次的题目集基于第三次作业三角形的判断又做了很大的提升。(2)题目集五:凸五边形的计算,这次题目集两道题可以算是是一道题,我猜老师觉得......
  • 多进程与多线程 python
    进程之间的数据传递全局变量在多个进程中不共享,进程之间的数据是独立的,默认情况下互不影响用Queue实现多进程之间的数据传递Queue是多进程安全的队列,可以使用Queue......
  • idea中新建文件,文字改变,Java编码规范,CMD中的注意事项
    Java程序运行机制:1.编译制——C,C++解释制——网页-——Java先编译再解释新建文件src——右键第一个——第一个——name:HelloHello代码:publicclassHello{publ......
  • JAVA PTA第二次总结
    前言(1)前言:经过了前面的作业感觉后面的作业都没有像前面的那么折磨,可能已经习惯了折磨的感觉,写起来特别顺手。(2)设计与分析:7-2点线形系列4-凸四边形的计算用户输入一......
  • Error updating database. Cause: java.sql.SQLException: Field 'id' doesn't have
    我想着id(主键)不填写的话可以在增加数据的时候可以自动添加上,且递增的,但是在添加数据的时候却报错了Errorupdatingdatabase. Cause:java.sql.SQLException:Field'i......
  • java基础-注解
    以下为本人的学习笔记 1.认识Annotation  JDK1.5开始,java增加了对元数据(即类的组成单元数据)的支持,也就是(Annotation)注解,它是代码里做的特殊标记,这些标记可以在编译,类......
  • Java的第一个程序“Hello word!”
     前提条件:新建文件夹,存放代码(code)新建一个Java文档,将.text改成.Java编写程序publicclassHello{publicstaticvoidmain(Sting【】args{System.out.print(“......
  • 多线程
    学习文档:https://www.cnblogs.com/gh110/p/15153666.html学习视频:https://www.bilibili.com/video/BV1V4411p7EF/ 1.线程创建(三种方法)1.1继承Thread类(重要)a.自定......
  • 一文带你了解Java中的Scanner键盘输入关键字、random 随机数关键字、System类和匿名函
    Scanner键盘输入Scanner类的功能:可以实现键盘输入数据,到程序当中。引用类型的一般使用步骤:1.导包import包路径.包名称如果需要使用目标类,和当前类位于同一个包下,......
  • JAVA题目集4、5及期中考试总结Blog
    一、前言题目集四:知识点:类的应用,正则表达式,面向对象思想,四边形的一些知识点。题量:适中。难度:比较难。题目集五:知识点:类的应用,面向对象的思想,正则表达式,五边形的有关......