Java 容器学习二
Java 容器
LinkedHashMap
基本特点:继承自 HashMap,对 Entry 集合添加了一个双向链表。
用途:保证有序,特别是 Java8 stream 操作的 toMap 时使用。
原理:同 LinkedList,包括插入顺序和访问顺序。
安全问题:
1、写冲突。
2、读写问题,可能会死循环。
ConcurrentHashMap-Java7 分段锁
分段锁
默认 16 个 Segment,降低锁粒度。
concurrentLevel = 16
原理有点类似数据库中的分库分表。
ConcurrentHashMap-Java8
Java 7 为实现并行访问,引入了 Segment 这一结构,实现了分段锁,理论上最大并发度与 Segment 个数相等。
Java 8 为进一步提高并发性,摒弃了分段锁的方案,而是直接使用一个大的数组。
线程安全操作利器 - ThreadLocal
• 线程本地变量
• 场景: 每个线程一个副本
• 不改方法签名静默传参
• 及时进行清理
伪并发问题
- 跟并发冲突问题类似的场景很多
- 比如浏览器端,表单的重复提交问题
-- 1、客户端控制(调用方),点击后按钮不可用,跳转到其他页
-- 2、服务器端控制(处理端),给每个表单生成一个编号,提交时判断重复
分布式下的锁和计数器
- 分布式环境下,多个机器的操作,超出了线程的协作机制,一定是并行的
- 例如某个任务只能由一个应用处理,部署了多个机器,怎么控制
- 例如针对用户的限流是每分钟 60 次计数,API 服务器有 3 台,用户可能随机访问到任何一台,怎
么控制?(秒杀场景是不是很像?库存固定且有限。)
版权声明: 本文为 InfoQ 作者【风翱】的原创文章。
原文链接:【http://xie.infoq.cn/article/1b171e61f4e61a8e827109e35】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论