java锁的问题速通

news/2024/10/19 21:56:33

 

1.syncronized底层原理——悲观锁

synchronized有对象锁和类锁两种,多个线程中只有一个线程可以获取对象锁,其他线程都会处于阻塞状态

synchronized是底层是基于monitor实现的。monitor是C++编写的jvm对象,主要分为owner(这个只会存一个线程的信息,记录当前锁被哪个线程获取了)、entrySet(这个是一个队列,记录没有抢到锁的线程,他们都是处于block状态的)、waitSet(记录调用了wait方法的线程)

monitor属于重量级锁,在jdk1.6之后又引入了偏向锁和轻量级锁

(更难的听不懂了,涉及JVM)

 

2.谈谈JMM(java memory model)java内存模型

JMM定义共享内存中,多线程程序的读写规范。JMM把内存分为工作内存和主内存;线程和线程之间是隔离的,但是可以通过线程1把消息从工作内存发送给主内存,再由主内存把消息推送给线程2,实现线程之间的交互

个人理解工作内存≈栈内存Stack,而主内存≈堆内存Heap

 

3.谈谈CAS(compare and swap)——乐观锁 | 自旋锁

cas是一种乐观锁思想,在无锁情况下保证线程操作共享数据的原子性。

java中的cas是基于操作系统的cas实现的,属于native方法;工作内存从主内存读取到的数据,我们需要把旧数据修改。当要修改时我们会再次比对工作内存的旧数据和主内存的数据,如果一致,那么就可以修改;如果不一致,那就要发生自旋:工作内存再次去主内存读取数据并重复上述方法。

在锁竞争不激烈的情况下cas是比synchronized效率要好的

 

4.乐观锁和悲观锁的区别

乐观锁允许别的线程修改变量,如果别的线程修改了变量那就自旋

悲观锁不允许别的线程修改变量,每次上锁的时候别的线程都会阻塞

 

5.关键字volatile

可见性:在线程中使用volatile修饰共享变量,可以防止编译器优化的发生。

下述例子中,下方的线程while(flag)被JIT(即时编译器)优化为了while(true),从而导致上面的线程修改flag下面的线程却读不到结果,这时我们可以给flag添加volatile来阻止编译器优化

static boolean flag=true;public static void main(String[] args) throws InterruptedException {new Thread(()->{try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}flag=false;System.out.println(flag+"已经修改");}).start();new Thread(()->{int i=0;while (flag){i++;}System.out.println(flag+"_"+i);}).start();}

禁止指令重排序:阻止一些读写操作越过屏障发生一些意外问题(写是防止当前指令越过上方指令,读是防止当前指令越过下方指令)

 

6.什么是AQS

AQS是抽象队列同步器,与synchronized不同的是他是由java实现的,并且锁激烈竞争的情况下有多种解决方案而不是像synchronized一样只有重量级锁

通过volatile保证state的可见性,然后当某一线程持有state后改变其数值,后续等待线程进入队列,依据队列完成排队

如何保证原子性:利用CAS在抢state时保证原子性

 

7.什么是公平锁:

新来的线程和队列中等待的线程争抢锁资源

非公平锁:

新来的线程只能进入队列的tail,只有队列的head能获取锁资源

注意,一般情况下公平锁的效率没有非公平锁高,公平锁的吞吐量较低

 

8.ReentrantLock可重入锁的原理

reentrantLock是基于AQS队列+CAS实现的,有无参构造函数和是否使用公平锁的构造函数,其中无参情况下默认是false

 

9.synchronized和lock的区别

  • 语法上:synchronized是关键字,底层由C++实现,来自jvm;lock是接口,底层java原生,来自jdk。
  • 功能上:都是悲观锁,互斥同步;lock有比synchronized更丰富的功能,lock除了正常锁以外还有公平锁,可打断锁,超时锁,多条件锁(这个类似于await和notify),并且读写锁就是是lock。但是synchronized在退出代码块后会自动释放,而lock需要手动调用unlock来释放锁。
  • 性能上:竞争不激烈的时候synchronized因为有偏向锁和轻量级锁优于lock,在竞争激烈的情况下lock具有更好的性能

 

10.死锁的产生条件

一个线程同时获取多把锁

如何检查死锁的发生:

  • 先用jps查看当前进程,进程里如果有死锁会显示xxx线程为deadlock,再用jstack查看详细信息
  • 在jdk目录中找jconsole,此时能选择你在jps里查看的所有进程

 

11.讲讲concurrentHashMap

JDK1.7使用segment数组+hashmap实现了concurrenthashmap;通过对key的hash计算找到对应的segment数组,然后通过reentrantLock锁住具体的segment数组,高并发的时候会通过CAS自旋锁来保证数据安全,然后再通过hash定位具体位置。劣势就是多个key如果hash相同的话他们就会阻塞。segment数组不能进行扩容,这也导致1.7的concurrenthashmap的性能不好

JDK1.8版本下采用CAS和synchronized对HashMap进行了增强。

利用CAS来控制扩容的实现,为头结点上锁,暂停其他线程的put操作,避免了多线程的插入冲突;在空位置新增节点时,也会采用CAS确保并发下能插入成功

synchronized只锁链表或者红黑树的首节点,保证数组节点只能被一个线程修改,降低了锁的颗粒度并且只要hash不冲突就不会有效率问题;在扩容时通过synchronized保证了数据迁移的一致性和完整性

 

12.java如何保证多线程的执行安全

原子性:一个线程在CPU中的操作是不可暂停的,是无法中断的。这里我们是通过锁解决,保证数据正确

可见性:一个线程对共享变量的修改对另一个线程可见。这里我们使用volatile保证可见性

有序性:处理器为了提高程序运行效率,对输入代码进行优化,不能保证程序中各个语句的执行顺序同代码中的顺序一致,但是能保证程序最终执行结果和代码顺序执行的结果一致。这里我们使用volatile保证有序性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/73593.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

PbootCMS登录请求发生错误

PbootCMS登录请求发生错误排查步骤删除runtime目录进入PbootCMS的根目录。 找到并删除runtime目录。 刷新页面后重新尝试登录。检查会话文件存储目录的写入权限确认data/session目录存在且具有写入权限。 可以通过FTP或服务器管理工具检查和修改目录权限,确保Web服务器用户(如…

征程 6E DISPLAY 功能介绍及上手实践

01 功能概述 本文将带大家一起实现单路、多路 MIPI CSI TX 输出、IDU 回写、IDU oneshot 模式、绑定输出 VPS 数据等功能,此处主要介绍各 sample 的实现与使用方法。 02 软件架构说明 本文中绑定 VPS 输出功能基于 libvio API 实现,调用 libvio 提供的 API,同时通过配置文件…

The 2022 ICPC Asia Nanjing Regional Contest IGDA,和令人疑惑的M

The 2022 ICPC Asia Nanjing Regional Contest IGDA,和令人疑惑的MI - 完美回文 题意 把单词改成一串相同的字母,最小修改次数 思路 把所有字母改成这个单词中出现次数最多的字母 代码 #include <bits/stdc++.h> using namespace std;void solve() {string s;map<cha…

fastStone Capture截图神器,你想要的功能它都有!

前言 大家好,我是小徐啊。从今天开始,小徐将介绍很多Java开发领域相关的软件工具资源,欢迎大家关注。今天,介绍一款非常小巧,但功能十分强大的图片软件,fastStone Capture。这款工具,主要是图片的截图,编辑,以及屏幕录屏等功能,可以说非常强大了。文末附获取方式。 安…

低功耗4G模组:LCD应用示例

​ 今天我们学习合宙Air780E开发板LCD应用示例,文末【阅读原文】获取最新资料。本文档适用于Air780E开发板关联文档和使用工具lcd-demo: https://gitee.com/openLuat/LuatOS/tree/master/demo/lcdLuatools下载调试工具一、环境准备 1.1 Air780E开发板一套​1.2 屏幕一个 这里…

告别繁琐的云平台开发!IoT_CLOUD之【百度云】

​ 众所周知,市面上有很多云平台,阿里云、腾讯云、中移OneNET、华为云、百度云、涂鸦云、Tlink云等等......并且每家云平台都有自己的协议,工程师要移植不同的SDK代码或基于各家的手册文档对接不同的协议,看着都头大!!! 为解决繁琐的云平台开发困扰,合宙IoT_CLOUD应运而…

低功耗4G模组Air780E快速入门:使用文件系统存储温湿度数据

​ 伙伴们,今天我们来学习合宙低功耗4G模组Air780E快速入门之使用文件系统存储温湿度数据。 一、编写脚本 1.1 准备资料 780E开发板购买链接 780E开发板设计资料 LuatOS-Air780E-文件系统的使用-程序源码demo 合宙的TCP/UDP测试服务器 API使用介绍 780E开发板和DHT11​1.2 程序…

文件目录

知识总览文件目录的基本概念 上节说过,FCB 的有序集合称为文件目录,一个FCB 就是一个文件目录项。与文件管理系统和文件集合相关联的是文件目录,它包含有关文件的属性、位置和所有权等。首先来看目录管理的基本要求:从用户的角度看,目录在用户(应用程序)所需要的文件名和文…