一篇讲双锁检测的文章

2024-03-18 00:18
文章标签 检测 文章 一篇 双锁

本文主要是介绍一篇讲双锁检测的文章,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题来源于群里面一个同学发了一篇关于双锁检测的文章,然后就有人反对说,双锁检测是过时的。于是乎,我也去找了一下相关的文章。http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html,这一篇文,就是发到群里面的文章。

虽然这篇文章说了在1.5之后,可以使用final字段让对象完全初始化。但是,并没有说明,如果我们使用普通的成员变量,会不会造成对象半初始化对象。这里有一个共同的前提,就是这个被初始化对象是volatile类型。当时本人就给定了一个结论说如果被初始化对象包含普通类型字段(非final和volatile),那么,双锁检测一定是失败的,造成未完全初始化的对象。所以当时这个结论就错了,参考这篇文章http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html对新java内存模型的解读


Under the old memory model, accesses to volatile variables could not be reordered with each other, but they could be reordered with nonvolatile variable accesses. This undermined the usefulness of volatile fields as a means of signaling conditions from one thread to another.

这句话说明,在老的内存模型中,volatile是不能阻止对非volatile变量操作的重排序,从而volatile变量不能作为一种用于线程间通信的信号条件(这尼玛,怎么翻译,看代码就理解了)。

Under the new memory model, it is still true that volatile variables cannot be reordered with each other. The difference is that it is now no longer so easy to reorder normal field accesses around them. Writing to a volatile field has the same memory effect as a monitor release, and reading from a volatile field has the same memory effect as a monitor acquire. In effect, because the new memory model places stricter constraints on reordering of volatile field accesses with other field accesses, volatile or not, anything that was visible to thread A when it writes to volatile field f becomes visible to thread B when it reads f.

然后,这句话就说了,volatile对其他的非volatile变量也有可见性保证,于是,当使用volatile的时候,用于线程间的通信的信号条件,我们可以安全的使用双锁检测了。具体能够搜索的相关资料包括:jsr133(happen before,重排序,可见性)。
 

故事永远不是这么简单的结束的,结束实际上来源于两段诡异的代码。大致意思是,一个线程不断的创建ArrayList赋值给一个全局变量,另外几个线程同时读取这个ArrayList并调用add方法,那么在-server的jit编译下,会导致nullPointexception,如果对这个全局数组加上volatile,那么就不会抛这个异常出来(参考代码片段2)。

  另外一段代码就是模拟,工作线程copy 主内存的Integer,然后另一个线程不断给Integer赋值null,同样不会报错。这里有个技巧||和&&的区别。(参考代码片段1)


这里插上两段代码--

1.不会报错,因为max被copy到工作线程,当max加上volatile时,可以看到直接出错,因为max为null

public class Main {public static Integer max = null;public static void main(String[] args){Thread[] threads = new Thread[20];for (int i = 0; i < threads.length; i++) {threads[i] = new Thread(new Runnable() {@Overridepublic void run() {while (true) {if(max == null || max > 10){max = 10;}}}});threads[i].start();}Thread t1 = new Thread(){public void run(){while(true){max = null;}}};t1.start();}
}

2,这段代码会报错,因为重排序问题,导致l变量半初始化,ArrayList中的elementData并未成功初始化,调用l.size()时,发生NP错误。如果我们加上volatile修饰l,那么便不会报错了
</pre><span style="background-color: rgb(0, 0, 0);"></span><pre name="code" class="java">public class Test {public static List<String> l = new ArrayList<String>(1024); public static void main(String[] args) {
Thread[] threads = new Thread[20];for (int i = 0; i < threads.length; i++) {threads[i] = new Thread(new Runnable() {@Overridepublic void run() {int j = 0;while (true) {synchronized (HmacSHA1.class) {if(l.size() < 1024)l.add("ttt");}}}});threads[i].start();}Thread t1 = new Thread(){public void run(){while(true){List<String> local = l;l = new ArrayList<String>(1024);}}};t1.start();}}



这篇关于一篇讲双锁检测的文章的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/820646

相关文章

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.