线程安全集合类 —— ConcurrentHashMap
摘要:线程安全集合类概述 线程安全集合类可以分为三大类: 遗留的线程安全集合如 Hashtable , Vector 使用 Collections 装饰的线程安全集合(每个方法都加上了 sychronized,性能不是很高),如: Collections.synchronizedCollection Co
阅读全文
ReentrantLock
摘要:ReentrantLock 相对于 synchronized 它具备如下特点 可打断 可以设置超时时间 可以设置为公平锁 支持多个条件变量 与 synchronized 一样,都支持可重入 基本用法 // 获取锁 reentrantLock.lock(); try { // 临界区 } finall
阅读全文
七、J.U.C
摘要:AQS 全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架 特点: 用 state 属性来表示可用资源数(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁 getState - 获取 state 状态 setState - 设
阅读全文
六、线程池
摘要:自定义线程池 步骤1:自定义阻塞队列 class BlockingQueue<T> { // 1. 任务队列,双向链表 private Deque<T> queue = new ArrayDeque<>(); // 2. 锁 private ReentrantLock lock = new Reen
阅读全文
五、共享模型之不可变
摘要:日期转换的问题 问题提出 下面的代码在运行时,由于 SimpleDateFormat 不是线程安全的 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); for (int i = 0; i < 10; i++) { new Threa
阅读全文
四、共享模型之无锁
摘要:CAS 有一个共享变量余额,多线程调用减余额方法 withdraw 减少这个共享的余额变量 balance 方法内会启动 1000 个线程,每个线程做 -10 元 的操作 * 如果初始余额为 10000 那么正确的结果应当是 0。结果却大于 0 加锁解决 class AccountUnsafe im
阅读全文
三、共享模型之内存
摘要:一 volatile 主内存:所有的变量都存储在主内存。线程间变量值的传递均需要通过主内存来完成。 线程的工作内存:保存了被该线程使用的变量的主内存副本。线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的数据。不同的线程之间也无法直接访问对方工作内存中的变量。线程间
阅读全文
并发编程 - 模式与应用
摘要:限制 1、限制对 CPU 的使用 单核 CPU 下,while (true) 里如果什么都不干, CPU 会空转占用会很快达到 100% 。这时 while(true) 里哪怕用 sleep(1) 也会大幅降低 cpu 占用 sleep 实现 while(true) { try { Thread.s
阅读全文
sychronized 原理,锁升级优化
摘要:Java 对象头 以 32 位虚拟机为例 普通对象 所以以 Integer 和 int 为例子 Integer 8字节对象头 + 4字节 int 值,所以大小是 int 的 3 倍 int 4字节 int 值 数组对象 如 Student[] s = new Student[8],还包括数组长度 l
阅读全文
二、共享模型之管程
摘要:共享带来的问题 两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗? static int counter = 0; public static void main(String[] args) throws InterruptedException { T
阅读全文
ThreadLocal
摘要:参考: java guide : https://javaguide.cn/java/concurrent/java-concurrent-questions-03.html 阿里云开发者社区:https://developer.aliyun.com/article/1180633 Dongguab
阅读全文
一、Java 线程
摘要:创建和运行线程 方法一:继承 Thread,重写 run() 方法 实际上是用 匿名内部类 实现了一个 Thread 的子类,override run() 方法 start() 让线程 runable,即让操作系统可以给它分配时间片 // 创建线程对象 Thread t = new Thread()
阅读全文
HashMap
摘要:元素在数组中的位置由key.hashCode()的值决定,如果两个key的哈希值相等,即发生了哈希碰撞,用链地址法解决 Hash 碰撞 当然这张图中没有体现出来的有两点: 为了提升整个HashMap的读取效率,当 HashMap 中的元素个数超过 数组大小*负载因子 时 扩容,以减小哈希碰撞。 在
阅读全文