首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第一章:相关概念
1.1 并发和并行
1.2 进程和线程
1.3 线程调度
1.4 多线程的应用场景
第二章:线程的创建和使用
2.1 概述
2.1 JDK 5之前创建线程的方式
2.1.1 概述
2.1.2 继承 Thread 类
2.1.3 实现 Runnable 接口
2.1.4 继承方式和实现方式的区别
2.2 设置线程名称和获取线程名称
2.3 线程的优先级
第三章:线程安全
3.1 售票程序引出线程安全
3.2 线程安全的原因
3.3 线程安全的解决方法
3.4 JDK 5 之前解决线程安全
3.4.1 概述
3.4.2 同步机制的原理
3.4.3 同步机制中的锁
3.4.4 应用示例
3.5 JDK 5 之后解决线程安全
3.6 死锁
3.7 synchronized 与 Lock 的对比
第四章:线程通信
4.1 为什么需要线程通信?
4.2 等待唤醒机制
4.3 生产者和消费者问题
4.4 sleep() 和 wait() 方法的区别
4.5 生产者和消费者性能问题
4.6 Lock 接口的深入
第五章:单例设计模式
5.1 概述
5.2 单例模式
第六章:线程池
6.1 概述
6.2 线程池相关的API
6.3 实现 Callable 接口
6.4 ThreadPoolExecutor
第七章:线程的生命周期
第八章:volatile 关键字
8.1 概述
8.2 应用示例
第九章:原子性
9.1 概述
9.2 AtomicInteger
9.2.1 常用方法
9.2.2 原理
9.2.3 源码解析
9.3 synchronized 和 CAS 的区别
第十章:并发工具类
10.1 Hashtable
10.2 ConcurrentHashMap
10.3 CountDownLatch
10.4 Semaphore
当前位置:
首页>>
技术小册>>
Java语言基础8-Java多线程
小册名称:Java语言基础8-Java多线程
- ConcurrentHashMap出现的原因 :在集合类中的 HashMap 是比较常用的集合对象,但是 HashMap 是线程不安全的,为了保证线程安全,我们可以使用 Hashtable ,但是 Hashtable 的效率很低。 - 基于上面的两个原因,JDK 5 提供了 ConcurrentHashMap 。 ![](/uploads/images/20230725/fa159b7a58d9b218e4c8e5bf5b84919c.png) - ConcurrentHashMap 在 JDK 7 和 JDK 8 中的原理不一样。 - ConcurrentHashMap 在 JDK 7 中的原理: ![](/uploads/images/20230725/2d371721f04ccfe2ee69c850640bcfbf.png) - ConcurrentHashMap 在 JDK 8 中的原理: - 底层结构:数组 + 链表 + 红黑树。 - 结合 CAS 机制 + synchronized 同步代码块形式保证线程安全。 ![](/uploads/images/20230725/d7c02ab5deea858d0794d111e71cb22a.png) ConcurrentHashMap 在 JDK 8 中的原理: - 如果使用空参构造创建 ConcurrentHashMap 对象,则什么事情都不做。在第一次添加元素的时候创建哈希表。 - 计算当前元素应存入的索引。 - 如果该索引位置为 null ,则利用 cas 算法,将本结点添加到数组中。 - 如果该索引位置不为 null ,则利用 volatile 关键字获得当前位置最新的结点地址,挂在他下面,变成链表。 - 当链表的长度大于等于 8 时,自动转换成红黑树。 - 以链表或者红黑树头结点为锁对象,配合悲观锁保证多线程操作集合时数据的安全性。 - 示例: ```bash package com.github.demo18; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * @author maxiaoke.com * @version 1.0 */ public class Test { public static void main(String[] args) { Map<String, String> map = new ConcurrentHashMap<>(); Thread t1 = new Thread(() -> { for (int i = 0; i < 25; i++) { map.put(String.valueOf(i), String.valueOf(i)); } }); Thread t2 = new Thread(() -> { for (int i = 25; i < 51; i++) { map.put(String.valueOf(i), String.valueOf(i)); } }); t1.start(); t2.start(); System.out.println("---------------------------------------------"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } for (int i = 0; i < 51; i++) { System.out.println(map.get(String.valueOf(i))); } } } ```
上一篇:
10.1 Hashtable
下一篇:
10.3 CountDownLatch
该分类下的相关小册推荐:
深入拆解 Java 虚拟机
Java并发编程
Java语言基础7-Java中的异常
Mybatis合辑5-注解、扩展、SQL构建
Java语言基础6-面向对象高级
Mybatis合辑2-Mybatis映射文件
Java语言基础1-基础知识
java源码学习笔记
手把手带你学习SpringBoot-零基础到实战
Java语言基础2-运算符
Java必知必会-Maven高级
Java并发编程实战