JAVA并发编程(三)设计线程安全的类

一篇文章5分钟总结Java常见线程安全类 一、概念: 线程安全:就是当多线程访问时,采用了加锁的机制;即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读取完之后,其他线程才可以使用。防止出现数据不一致或者数据被污染的情况。 线程不安全:就是不提供数据访问时的数据保护,多个线程能够同时操作某个数据,从而出现数据不一致或者数据污染的情况。 对于线程不安全的问题,一般会使用synchronized关键字加锁同步控制。 线程安全 工作原理: jvm中有一个main memory对象,每一个线程也有自己的working 阅读详情

设计线程安全的类

设计线程安全类的过程中需要注意三个基本要素:

1、找出构成对象的所有变量

2、找出约束状态变量的不变性条件

3、建立对象状态的并发访问管理策略

同步策略定义了如何在不违背对象不变性条件或者后验条件的情况下对其状态的访问操作进行协同。同步策略规定了如何将不变性、线程封闭和加锁机制等结合起来以维护线程的安全性,并且规定了哪些变量由哪些锁来保护。确保可以对这个类进行分析维护,就需要将同步策略写为正式文档。

如果不了解对象的不变性体条件,就不能确保线程安全性。要满足在状态变量的有效值或者状态转换上的各种约束条件,就需要借助于原子性和封装性。

实例封闭

封装简化了线程安全类的实现过程,将数据封装在对象内部,可以将数据的访问限制在对象的方法上,从而更容易确保线程在访问数据时总能持有正确的锁。

封装更易于构造线程安全的类,因为当封装类的状态时,在分析类的线程安全性时就无须检查整个程序。

线程安全性的委托

如果一个类由多个独立且线程安全的状态变量组成,并且在所有的操作中都不包含无效的状态转换,那么可以将线程安全性委托给底层的状态变量。
如果一个状态变量是线程安全的,并且没有任何不变性条件来约束它的值,在变量的操作上也不存在任何不允许的状态转换,那么久可以安全的发布这个变量。

同步容器类

在早期JDK中,同步容器只有Vector和HashTable,后来引入了Colletions.SynchronizedXX来创建同步容器,这些类实现线程安全的方式是:将它们的状态封装起来,并对每个公有方法都进行同步,使得每次只有一个线程能访问容器的状态。

尽管同步容器类是线程安全的,但是在某些情况下仍然需要额外的客户端加锁来保护复合操作。

并发容器

Java5.0提供了多种并发容器来改进同步容器的性能。同步容器将所有对容器状态访问都串行化,以实现它们的线程安全,这种方法的代价是严重降低了并发性。当多个线程竞争容器锁时,吞吐量将严重降低。

通过并发容器代替同步容器,可以极大的提高伸缩性,降低风险。

常用的类有ConcurrentHashMap,CopyOnWriteArrayList,BlockingQueue,

ConcurrentLinkedQueue,ConcurrentSkipListMap等等。

同步工具类

闭锁是一种同步工具类,可以延迟线程的进度直到到达终止状态。CountDownLactch是一种灵活的闭锁实现。

FutureTask也可以用做闭锁。

计数信号量Semaphore用来控制同时访问某个特定资源的操作数量,或者同时执行某个操作的数量。

栅栏能阻塞一组线程直到某个事件发生。栅栏与闭锁的关键区别在于,所有线程必须同时到达栅栏位置才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。CyclicBarier是一种栅栏实现。






欢迎扫描二维码,关注公众号



「死磕Java并发编程」说说Java Atomic 原子类的实现原理 <!-- TOC --> - [线程安全真的是线程的安全吗?](#线程安全真的是线程的安全吗) - [什么是 Atomic?](#什么是-atomic) - [实现一个计数器](#实现一个计数器) - [AtomicInteger 源码分析](#atomicinteger-源码分析) - [AtomicLong 和 LongAdder 谁更牛?](#atomiclong-和-longadder-谁更牛) - [总结](#总结) <!-- /TOC --> .. 阅读详情

相关推荐

良好的并发编程习惯之利用线程安全类

也因此,常见的并发需求通常也集中在对集合(collection)类的读写上。日常的线程安全问题通常会落在原始( primitive)类型和集合(Collection)类,而使用对应的线程安全类通常就能直接解决问题。我们日常开发中的并发需求,通常用 JUC 中的类替换相应的原始类型或集合类,就可以达到线程安全。两种同步原语,在性能要求高的一些场景下,用它们来实现细粒度的同步会极大增加代码的复杂程度,性能也不好。虽然可能显而易见,要注意的是只有包装类提供的方法才保证是原子的,而里面存储的内容则没有。

彩虹地带 1340

常用线程安全类型(ArrayList、LinkedList、CopyOnWriteArrayList、HashMap、LinkedHashMap、ConcurrentHashMap)

常用线程安全类型(ArrayList、LinkedList、CopyOnWriteArrayList、HashMap、LinkedHashMap、ConcurrentHashMap)、线程安全

YimBa的博客 5716

Java并发编程中的线程安全与原子类

本文探讨了Java并发编程中的线程安全问题,特别是在多线程环境下对共享资源的操作可能导致数据不一致的风险。通过分析前增量操作符++在多线程下的非原子行为和由此引发的race condition问题,介绍了java.util.concurrent.atomic包下的原子类如何通过原子操作来解决这一问题。此外,还探讨了使用synchronized关键字和同步块来确保线程间的顺序执行和数据的一致性。

weixin_42113456的博客 1007

线程安全类

因此,它适合随机查找和遍历,不适合插入和删除。Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。在这种机制中,任意数量的读取线程可以并发访问Map,执行读取操作的线程和执行写入操作的线程可以并发地访问Map,并且一定数量的写入线程可以并发地修改Map,这使得在并发环境下吞吐量更高,而在单线程环境中只损失非常小的性能。

Leo_Wcg的博客 950

别再手动改文献了!手把手教你定制Mendeley的GB/T 7714-2005引用格式(附常见问题修复)

本文详细指导如何定制Mendeley的GB/T 7714-2005引用格式,解决科研文献管理中的常见问题。通过深度解析Mendeley样式编辑器,精准控制作者显示规则、出版社信息精简及期刊页码处理,实现参考文献一键合规。附常见问题修复和实战调试方法,大幅提升学术写作效率。

weixin_26833503的博客 374

无人机基本组成部件

无人机基本组成部件

qq_37410522的博客 1万+

java 线程安全的类型_线程安全的类在java中有几种?如何成为线程安全类?

上回我们说到了在java有哪些集合是线程安全的,其实,类也可以是线程安全的,你们知道都有哪些类是线程安全的吗?快跟小编一起了解了解吧。线程安全类有哪些?在java中分别有着四种线程安全的类,如下:1.vector类似于arraylist,但比arraylist多了个同步化机制,就是线程安全,但由于效率低下,现在已经不在使用了。因为在各种web应用中,特别是前台页面,往往效率是要最优先考虑的。2.s...

weixin_34338504的博客 5219

深入理解命名实体识别(NER)

命名实体识别(NER,Named Entity Recognition)是自然语言处理(NLP)中的一项重要技术,用于从文本中识别出特定类型的实体,并将这些实体分类到预定义的类别中。实体通常包括人名、地名、组织名、日期、时间、数量、货币等。例如,在句子“Barack Obama was born in Hawaii in 1961”中,NER任务的目标是识别“Barack Obama”作为人名,“Hawaii”作为地名,以及“1961”作为日期。

AngelCryToo的专栏 4638

java线程安全类

java线程安全类介绍

heat3_6的博客 1419

Windows 10/11系统下TurboDesign 6.4.0完整安装指南(附序列号+破解补丁)

本文提供Windows 10/11系统下TurboDesign 6.4.0的完整安装指南,涵盖系统环境预检、安装程序部署、序列号处理及破解补丁部署等关键步骤。通过详细的安装教程和优化配置,帮助用户高效完成这款涡轮机械设计软件的安装与调试,解决常见兼容性问题。

s4t5u6v的博客 1029

【ANSYS APDL】提取结构刚度矩阵完整过程--附Python代码实现

ANSYS的结构刚度矩阵提取中一些操作技巧

m0_61038364的博客 1万+

Java 并发编程(三)设计线程安全的类-实例封闭

到目前为止,我们已经介绍了关于线程安全与同步的一些基础知识。然而,我们并不希望对每一次内存访问都进行分析以确保是线程安全的,而是希望将一些现有的线程安全组件组合为更大规模的组合为更大规模的组件或程序。之后,我们会讲一些设计线程安全类的一些基本概念,介绍一些组合模式。

张小琦的博客专栏 3940

Flink上传的Jar包去了哪里?大数据

在使用Flink时,我们通常会将应用程序打包成Jar文件并将其上传到Flink集群以执行。总结起来,Flink上传的Jar包实际上会暂时存储在JobManager的本地文件系统中的一个临时目录中。在上传过程中,Flink会将Jar文件存储在JobManager的本地文件系统中的一个临时目录中。一般来说,Flink会在。希望本文对你解答了Flink上传的Jar包去了哪里的疑问,并且能够帮助你更好地理解Flink的工作原理。接下来,我们可以使用Flink命令行工具将Jar文件提交到Flink集群。

AlianBlank的博客 865

Java final关键字深度解析:从基础语法到并发编程实战

在Java编程语言中,final关键字是一个基础而重要的修饰符,它通过限制类、方法和变量的可变性来保障代码的稳定性和安全性。从原理层面看,final不仅体现了Java语言设计中的契约式编程思想,还通过禁止重排序和建立happens-before关系,在Java内存模型中为并发编程提供了安全发布对象的机制。这一特性对于构建高性能、线程安全的不可变对象具有重要技术价值,尤其在多线程环境下,final字段能够确保对象初始化过程的可见性,避免因指令重排序导致的数据不一致问题。在实际应用场景中,final广泛用于定义

weixin_33428613的博客 292

【YOLO】YOLOV5-Seg的Segment模块解析

Segment模块同时输出检测结果和分割掩模,通过轻量级分割头实现实时实例分割

浩瀚之水的专栏 598

手把手教你学simulink(16.8)--基于Simulink的小波变换滤波器(Wavelet Transform Filter)项目

基于Simulink的小波变换滤波器(Wavelet Transform Filter)项目的详细实例介绍。这个项目将重点放在小波变换滤波器的设计、实现和仿真上,帮助你理解和应用小波变换滤波器在信号处理中的作用。

MHD0815的博客 534

Java 并发编程:设计坚如磐石的线程安全类

通过理解线程安全的概念和原则,选择合适的同步策略和并发工具类,并注意发布和逸出等潜在的风险,我们可以构建出健壮、可靠的并发应用程序。一个类是线程安全的,当且仅当多个线程可以并发地访问并修改它的实例变量,而不会导致对象处于不一致的状态。当多个线程需要访问共享的可变状态时,必须使用适当的同步机制来协调它们的行为,确保在同一时刻只有一个线程能够修改该状态,从而避免数据竞争。等,它们提供了基于 CAS (Compare-and-Swap) 操作的原子性更新,避免了显式的锁竞争,通常具有更好的性能。

郑龙飞 857

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java并发编程之set集合的线程安全类你知道吗

Java并发编程之-set集合的线程安全类 Java中set集合怎么保证线程安全,这种方式你知道吗? 在Java中set集合是 本篇是《凯哥(凯哥Java:kagejava)并发编程学习》系列之《并发集合系列》教程的第二篇: 本文主要内容:Set集合子类底层分别是什么?基于底层为什么set的子类可以存放一个数据?怎么解决set线程安全问题? 一:Set集合子类 Set的三个子类分别是:...

凯哥Java的博客 3620

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Java集合中那些类是线程安全的

线程安全类 在集合框架中,有些类是线程安全的,这些都是jdk1.1中的出现的。在jdk1.2之后,就出现许许多多非线程安全的类。 下面是这些线程安全的同步的类: vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。 statck:堆栈类,先进后出 hashtable:就比

Mexican的博客 10万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java并发编程——如何保证对象的线程安全

前面我们已经介绍了线程安全和同步的一些知识,但是前边几节保证线程安全的方法都只局限于一个方法或一个类,如果要对一个线程安全的对象加以修改,那么还需重新判断是否是线程安全。所以我们这一节就从对象间组合的角度再来具体探讨线程安全。 设计线程安全的类 通过之前几节的学习我们已经知道,设计一个线程安全的类至少要满足三个步骤: 1. 找出构成对象状态的所有变量 2. 找出上述变量的约束性条件 3. 建立对象...

weixin_44810464的博客 924

并发编程-Java 线程安全机制

并发编程-Java 线程安全机制

weixin_45226668的博客 1149

掌握 Java 并发编程中的线程安全设计模式

Java 并发编程中的线程安全设计模式是开发者应对多线程挑战的有力工具。单例模式确保实例的唯一性和线程安全,生产者 - 消费者模式实现了任务的异步处理和解耦,线程池模式则优化了线程的管理和使用。在实际开发中,需要根据具体的业务场景和需求,选择合适的设计模式,并合理配置相关参数,以实现高效、可靠的并发程序。同时,对这些模式的深入理解和灵活运用,也有助于提升开发者在并发编程领域的技能和水平。

潜意识Java的博客 863

Java线程安全类设计思路总结

所谓线程安全类,是指当多个线程并发访问某个类的同一个实例时,无需额外同步措施,也能保证行为正确、结果一致。换句话说,这个类在多线程环境下不会出现竞态条件(Race Condition)或数据不一致的问题。注意:只有在类的对象可能被多个线程同时访问的情况下,才需要考虑线程安全。如果某个类在实际使用中不会被并发访问,那就没必要为了“线程安全”而引入额外的同步开销。在 Java 中构建线程安全的类,关键在于理解并发访问可能带来的风险,并根据类的使用场景选择合适的防护策略。以下是对前面所讲内容的总结。无状态类。

记不住所以写下来 1140

关于并发编程与线程安全的思考与实践

使用多线程处理问题已经变得很普遍,但是对于多线程共同操作的对象必须使用线程安全的类。另外,还要搞清楚几个灵魂问题:(1)JMM的灵魂:Happens-before 原则(2)并发工具类的灵魂:volatile变量的读/写 和 CAS。

京东科技开发者 1019

Java并发编程中的线程安全优化实践:从理论到落地

Java并发编程线程安全优化实践 本文针对Java后端开发中的并发问题,提出系统化优化方案。首先剖析三大核心痛点:竞态条件、死锁和内存可见性。通过对比synchronized、ReentrantLock、原子类等五种方案的优缺点,给出适用场景建议。重点以秒杀系统为例,演示从基础锁方案到无锁编程的演进: ReentrantLock保证原子性,解决超卖问题 原子类+CAS机制实现无锁优化,性能提升30%+ 最终方案整合线程池(合理配置核心参数)与并发容器,实现高吞吐量 最佳实践包括:优先JDK并发工具、最小化锁

2401_89145131的博客 1232

Java 并发编程之设计线程安全类

1.设计线程安全类 设计线程安全的类的步骤: 找出构成对象状态的所有变量找出约束状态变量的先验条件,后验条件,不变性条件建立对象状态的并发访问策略 2.实例封闭 封装简化了线程安全类的实现过程,提供了一种实例封闭的机制。当一个对象被封装到另一个对象中时,能够访问被封装对象的所有代码路径都是已知的。通过将封装机制和合适的加锁机制结合起来,可以确保以线程安全的方式来使用非线程安全的

Mind And Hand 500
上一篇: Android中View绘制流程分析
下一篇: 算法系列(十三)图论基本概念和拓扑排序
robert_chao
博客等级 码龄15年 265粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值