java 并发 唯一_Java并发相关

本文深入探讨了Java中的单例模式及其在并发环境下的实现,包括饿汉模式、懒汉模式、双检锁等。同时,介绍了Java的并发工具如AQS、CAS、线程池和并发集合的特性与应用场景。线程安全的实现策略,如非阻塞和阻塞集合的选择,以及HashMap在多线程下的问题也得到了讨论。
摘要由CSDN通过智能技术生成

单例模式

为什么会有单例模式的需求,多个线程要操作一个对象,需要对象具有唯一性、比如文件系统,回收站,任务管理器等等,计数器,日志系统,线程池。需要做到,只有一次实例化,并提供得到实例的接口。单例模式有以下几种实现方法:1.饥饿模式,线程安全,比较耗费资源,因为加载过程种完成了实例化。2.懒汉模式,调用时再实例化,效率高,线程不安全。3. 懒汉+synchorized,读写对象变成了线程,性能差。4.double check locking ,性能适合,可能会有空指针情况出现,成员变量会重排。 5.volitle+doublecheck locking 性能适合,线程安全。6. holder模式,类种静态类,静态类在调用时实例化,实例化的过程又是同步的,达到了懒加载,又消除了锁,现在大部分情况下使用这种。7.枚举模式,需要熟悉枚举类型,有些难理解。

java内部的锁机制。CAS,compareandset\compareandswap使用原子指令对比较简单的数据类型进行计算,保证操作的原子性。实现原理是调用native方法,native方法中调用c++的实现,对应到cpu上一条原子指令,保证操作的原子性。AQS,定义了一套模版,实现的原理是链接组成的优先队列加一系列的标志位,使用的理论是乐观锁的理论,应用比较广泛,流行的一些锁机制都是基于AQS。AQS的竞争有公平竞争和非公平竞争,公平竞争是在获取资源时先查看资源是否被锁,如果没有被锁,再查看队列中排队是否轮到自己,二非公平竞争只需要看自己资源是否被锁,没有被锁就能直接去竞争资源。

基于AQS有一些列的锁的类,例如countdownlounch,固定数目的资源,多线程每一个线程进入临界区,countdown减一,直到全部用完,适合于多线程各自做某事,做完之后再汇总。CyclicBarrier适合的场景是等待固定数量的线程,都到齐之后一起再做事情,例如赛跑,各就各位,再使用跑道。Semaphore,信号量机制,固定数目的资源,有进有出,例如停车场场景。

针对并行编程用到集合的时候需要考虑集合是否是线程安全的,例如hashmap就不是线程安全的,线程安全的集合分为两类,一类是非阻塞的集合,例如concurrentlinkedDeqeue,操作这类集合时,如果失败将返回空或者抛出异常,不会影响线程继续运行,二阻塞集合,例如LinkedBlockDeque,预先给一个集合的大小,当集合满或者为空,操作失败时,会阻塞线程,直到操作成功。这其中是依靠锁和synchorized关键字来锁定代码片段来保证线程安全的。 顺便复习下hashmap,hashmap底层是数组+链表(红黑树),线程不安全,在扩容过程中可能会出现死锁,可以插入空值,但只有一个空值。

线程池的目的:减少系统开销,解耦合,运行和创建销毁分开,提高线程复用率。线程池的试用,使用executors的系统工厂创建,执行execute方法来执行任务,几种常用的executeor类,固定数量线程的线程池,可调度的线程池,单个线程的线程池等等。基本类型是ThreadPoolExecutor,内部包含的控制状态的参数来标识线程池的状态,主要方法是execute,不用时需要关闭线程池。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值