java uuid 线程安全_Java高并发(五) - 线程安全策略

一、不可变对象

不可变对象满足的条件

对象创建后其状态不能修改

对象所有域都是 final 类型

对象是正确创建的 (在对象创建期间,this 引用没有逸出)

final 关键字

可修饰 类(不能被继承),方法(不能被重写),变量(不能被改变)

常见的 final 类

Java.lang 包

包装类:Boolean,Character,Short,Integer,Long,Float,Double,Byte,Void

字符串类:String,StringBuilder,StringBuffer

系统类:Class,System,RuntimePermission,Compiler

数学类:Math,StrictMath

其他:Character.UnicodeBlock,ProcessBuilder,StackTraceElement

java.util 包

UUID,Scanner,Optional

java.lang.reflect 包

Array,Constructor,Field,Parameter,ReflectPermission

Java.net 包

HttpCookie,Inet4Address,Inet6Address,URL,URI

java.time 包

Clock,ZoneId,Year,YearMonth,MonthDay

final 类的好处

final 关键字提高性能,JVM 和 Java 应用都会缓存 final 变量。

final 关键字可以在安丘安的多线程环境下共享,而不需要额外的同步开销。

使用final 关键字,JVM 会对方法,变量及类进行优化。

二、线程不安全的类

非线程安全的类:StringBuilder,SimpleDateFormat,ArrayList,HashSet,HashMap

线程安全的类:StringBuffer,DateTimeFormatter,CopyOnWriteArrayList

三、并发容器 J.U.C

JDK 提供的这些容器大部分在 java.util.concurrent 包中。

HashMap —> ConcurrentHashMap:这是一个高效并发 HashMap,可以理解为一个线程安全的 HashMap。

通过锁分段技术保证并发环境下的写操作;

通过 HashEntry的不变性、Volatile变量的内存可见性和加锁重读机制保证高效、安全的读操作;

通过不加锁和加锁两种方案控制跨段操作的的安全性。

TreeMap —> ConcurrentSkipListMap:跳表的实现,是一个 Map,使用跳表的数据结构解析快速查找。Java多线程(四)之ConcurrentSkipListMap深入分析

跳表是一种用于快速查询的数据结构,类似于平衡树。它们都可以对元素进行快速查找,但有一个重要的区别就是:对平衡树的插入和删除往往可能导致平衡树进行全局调整,而跳表的插入和删除只需要对整个数据结构的局部进行操作即可。

好处:在高并发情况下,你会需要一个全局锁来保证整个平衡树的线程安全,而对于跳表,只需要部分锁即可。在高并发下,就可以拥有更好的性能,而查询性能而言,跳表的时间复杂度也是 O(logn),所以在并发数据结构中,JDK 使用跳表来实现一个 Map。

跳表的另一个特点是随机算法,跳表的本质是维护了多个链表,并且链表是分层的。

12053e18bb80

ConcurrentSkipListMap 数据结构

最低层链表维护了跳表内所有元素,每上面一层链表都是下面一层的子集,一个元素插入哪些层是完全随机的。跳表内所有链表的元素都是排序的,查找时从顶层链表开始,一旦发现被查找元素大于当前链表中的取值,就会转入下一层链表继续查找。就是说查找过程是跳跃式的。

如:查找元素 7

查找从顶层头部索引开始,由于顶层元素最少,因此可以快速跳过那些小于 7 的。很快查找就能到 6,由于在第 2 层,8 大于 7,故肯定在 2 层无法找到 7,直接进入 底层开始查找,很快根据 6 元素搜索到 7。跳表是一种使用空间换时间的算法。

12053e18bb80

ConcurrentSkipListMap 查找案例

ArrayList —> CopyOnWriteArrayList:这是一个 List,在读多写少的场合,List 性能非常好,远远好于 Vector。读取完全不加锁,写入也不会阻塞读取操作,只有写和写之间需要同步等待。写入操作是复制一份副本进行操作,写完之后将副本替换掉原来的数据,这样保证写操作不影响读。

HashSet、TreeSet —> CopyOnWriteArraySet、ConcurrentSkipListSet:CopyOnWriteArraySet 底层实现 CopyOnWriteArrayList 【深入Java集合学习系列:深入CopyOnWriteArraySet】,ConcurrentSkipListSet 底层实现是 ConcurrentSkipListMap【Java多线程系列--“JUC集合”06之 ConcurrentSkipListSet】。

BlockingQueue:是一个接口,JDK 内部通过链表,数组等方式实现,表示阻塞队列,非常适合作为数据共享的通道。

Collections.synchronizedXXX(List, Set,Map):Collections 类提供一些 static 方式实现List,Set 和 Map 的同步。

参考:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值