Java高并发(五) - 线程安全策略

Java高并发(一)- 并发编程的几个基本概念
Java高并发(二) - Java 内存模型与线程
Java高并发(三) - CountDownLatch、CyclicBarrier和Semaphore
Java高并发(四) - Java 原子类详解
Java高并发(五) - 线程安全策略
Java高并发(六) - 锁的优化及 JVM 对锁优化所做的努力

一、不可变对象

不可变对象满足的条件

  1. 对象创建后其状态不能修改
  2. 对象所有域都是 final 类型
  3. 对象是正确创建的 (在对象创建期间,this 引用没有逸出

final 关键字

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

常见的 final 类

  1. Java.lang 包
    • 包装类:Boolean,Character,Short,Integer,Long,Float,Double,Byte,Void
    • 字符串类:String,StringBuilder,StringBuffer
    • 系统类:Class,System,RuntimePermission,Compiler
    • 数学类:Math,StrictMath
    • 其他:Character.UnicodeBlock,ProcessBuilder,StackTraceElement
  2. java.util 包
    • UUID,Scanner,Optional
  3. java.lang.reflect 包
    • Array,Constructor,Field,Parameter,ReflectPermission
  4. Java.net 包
    • HttpCookie,Inet4Address,Inet6Address,URL,URI
  5. java.time 包
    • Clock,ZoneId,Year,YearMonth,MonthDay

final 类的好处

  1. final 关键字提高性能,JVM 和 Java 应用都会缓存 final 变量。
  2. final 关键字可以在安丘安的多线程环境下共享,而不需要额外的同步开销。
  3. 使用final 关键字,JVM 会对方法,变量及类进行优化。

二、线程不安全的类

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

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

三、并发容器 J.U.C

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

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

    彻头彻尾理解 ConcurrentHashMap

    • 通过锁分段技术保证并发环境下的写操作;
    • 通过 HashEntry的不变性、Volatile变量的内存可见性和加锁重读机制保证高效、安全的读操作;
    • 通过不加锁和加锁两种方案控制跨段操作的的安全性。
  • TreeMap —> ConcurrentSkipListMap:跳表的实现,是一个 Map,使用跳表的数据结构解析快速查找。Java多线程(四)之ConcurrentSkipListMap深入分析

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

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

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


    ConcurrentSkipListMap 数据结构

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

    如:查找元素 7

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


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

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

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

  • ConcurrentLinkedQueue:高效读写队列,线程安全没有任何锁操作,完全由 CAS 操作和队列算法保证。Java并发编程(七)ConcurrentLinkedQueue的实现原理和源码分析Java 线程 — ConcurrentLinkedQueue

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

参考:

http://www.importnew.com/7553.html

https://blog.csdn.net/dgeek/article/details/53425192

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,692评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,482评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,995评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,223评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,245评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,208评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,091评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,929评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,346评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,570评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,739评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,437评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,037评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,677评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,833评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,760评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,647评论 2 354

推荐阅读更多精彩内容