
Java并发编程
文章平均质量分 93
Java并发编程
Zhang_960110
写博客的初衷:记录自己学习、思考、总结的过程;建立自己知识库,分类汇总保留。
展开
-
Semaphore、CountdownLatch、CyclicBarrier详解
文章目录1.Semaphore1.1 基本使用1.2 Semaphore原理-图解流程1.3 Semaphore原理-源码分析2.CountdownLatch3.CyclicBarrier1.Semaphore信号量,用来限制能同时访问共享资源的线程上限。1.1 基本使用/** * @ClassName SemaphoreTest * @author: shouanzh * @Description 信号量,用来限制能同时访问共享资源的线程上限。 * @date 2022/3/20 11:3原创 2022-03-20 15:00:42 · 973 阅读 · 0 评论 -
读写锁ReentrantReadWriteLock原理
文章目录1.ReentrantReadWriteLock使用2.ReentrantReadWriteLock原理2.1 图解流程2.2 源码分析3.StampedLock1.ReentrantReadWriteLock使用当读操作远远高于写操作时,这时候使用 读写锁让 读-读可以并行,提高性能。读-写,写-写操作都是相互互斥的!代码举例提供一个 数据容器类内部分别使用读锁保护数据的read()方法,写锁保护数据的 write()方法/** * @ClassName TestReadWriteLo原创 2022-03-19 17:26:18 · 617 阅读 · 0 评论 -
AQS原理、ReentrantLock原理
文章目录1.AQS原理1.1 概述1.2 自定义锁2.ReentrantLock原理2.1 非公平锁实现原理1.AQS原理1.1 概述全称是AbstractQueuedSynchronizer, 是阻塞式锁和相关的同步器工具的框架特点用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何 获取锁和释放锁getState-获取state状态setState-设置 state状态compareAndSetState-CAS机制设置 state状态原创 2022-03-18 23:53:28 · 283 阅读 · 0 评论 -
线程池详解、ThreadPoolExecutor、异步模式之工作线程、任务调度线程池、 Fork/Join
文章目录1.线程池简介2.自定义线程池3.ThreadPoolExecutor3.1 线程池状态3.2 构造方法3.3 工作方式3.4 拒绝策略3.5 Executors3.5.1 newFixedThreadPool1.线程池简介线程池(ThreadPool)是一种基于池化思想管理和使用线程的机制。它是将多个线程预先存储在一个“池子”内,当有任务出现时可以避免重新创建和销毁线程所带来性能开销,只需要从“池子”内取出相应的线程执行对应的任务即可。如数据库连接池。使用线程池的优点如下:降低资源消耗。通原创 2022-03-17 23:47:48 · 1133 阅读 · 0 评论 -
CAS与volatile、原子整数、原子引用、原子数组、字段更新器、原子累加器、Unsafe
文章目录1.问题引出1.1 保护共享资源-加锁实现1.2 保护共享资源-无锁实现2.CAS与volatile2.1 CAS工作流程2.2 volatile作用2.3 CAS效率分析2.4 CAS特点3.原子整数4.原子引用4.1 AtomicReference4.2 原子引用-ABA问题4.3 AtomicStampedReference4.4 AtomicMarkableReference5.原子数组1.问题引出1.1 保护共享资源-加锁实现使用synchronized来保证多线程访问共享资源发生的原创 2022-03-14 22:03:13 · 689 阅读 · 1 评论 -
Java内存模型(JMM-原子性、可见性、有序性)、volatile原理、volatile保证可见性, 有序性
文章目录1.Java内存模型2.可见性2.1 不可见性导致的问题2.2 问题解决-可见性2.3 可见性 vs 原子性2.4 模式之两阶段终止2.5 同步模式之Balking3.有序性3.1 指令重排原理-指令并行优化3.2 指令重排导致的问题3.3 指令重排的禁用1.Java内存模型synchronized底层Monitor主要关注的是访问共享变量时,保证临界区代码的 原子性。下面进一步深入学习共享变量在多线程间的【可见性】问题 与 多条指令执行时的【有序性】问题。JMM即 Java Memory原创 2022-03-13 15:27:10 · 305 阅读 · 0 评论 -
ReentrantLock详解(可重入、可中断、锁超时、公平锁、条件变量)、同步模式之顺序控制
文章目录1.ReentrantLock详解1.1 可重入1.2 可中断 lockInterruptibly()1.3 设置超时时间 tryLock()1.4 通过lock.tryLock()来解决, 哲学家就餐问题1.5 公平锁 new ReentrantLock(true)1.6 条件变量 Condition1.ReentrantLock详解相对于synchronized 它具备如下特点可中断可以设置超时时间可以设置为公平锁支持多个条件变量与 synchronized 一样,都支持可重入原创 2022-03-12 12:19:50 · 18826 阅读 · 0 评论 -
Park & Unpark、线程状态转换、死锁、活锁、饥饿
文章目录1.Park & Unpark1.1 介绍1.2 与 Object 的 wait & notify相比1.3 Park & Unpark 原理2.线程状态转换3.多把锁3.1 多把不相干的锁3.2 死锁3.3 定位死锁3.4 死锁举例 - 哲学家就餐问题1.Park & Unpark1.1 介绍// 暂停当前线程LockSupport.park();// 恢复某个线程的运行LockSupport.unpark(暂停线程对象);先park()再unpar原创 2022-03-10 23:54:22 · 805 阅读 · 0 评论 -
同步模式之保护性暂停、异步模式之生产者/消费者
文章目录1.同步模式之保护性暂停1.1 概述1.2 实现1.3 join原理1.4 扩展-多任务版2.异步模式之生产者/消费者2.1 概述2.2 实现1.同步模式之保护性暂停1.1 概述即 Guarded Suspension, 用在一个线程等待另一个线程的执行结果有一个结果需要从一个线程传递到另一个线程,让他们关联同一个 GuardedObject如果有结果不断从一个线程到另一个线程 那么可以使用消息队列(见生产者/消费者)JDK 中,join 的实现、Future 的实现,采用的就是此模式原创 2022-03-09 23:37:07 · 184 阅读 · 0 评论 -
wait和notify原理
文章目录1.wait和notify1.1 小故事1.2 原理1.3 API介绍obj.wait() 和 obj.notify()sleep(long n)和 wait(long n) 的区别2.wait/notify的正确使用3.关于wait与notify和notifyAll方法的总结1.wait和notify1.1 小故事1.2 原理1.当前线程必须拥有此对象的monitor监视器(锁)。2.当前线程调用wait()方法,线程就会释放此锁的所有权,并等待3.直到另一个线程通过调用noti原创 2022-03-08 23:05:40 · 1829 阅读 · 0 评论 -
synchronized底层原理、偏向锁、轻量级锁、自旋锁详解
文章目录1.Java对象头2.Monitor工作原理3.synchronized原理4.synchronized原理进阶5.轻量级锁6.锁膨胀7.自旋优化8.偏向锁1.Java对象头对象头包含两部分:运行时元数据(Mark Word)和类型指针 (Klass Word)Mark WordMark Word用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,占用内存大小与虚拟机位长一致。类型指针类型指针指向对象的类元数据原创 2022-03-07 22:41:37 · 2597 阅读 · 1 评论 -
共享带来的问题、synchronized 解决方案、变量的线程安全分析
文章目录1.共享带来的问题1.1 小故事1.2 Java代码的体现1.3 问题分析1.4 临界区 Critical Section1.5 竞态条件 Race Condition2.synchronized 解决方案2.1 synchronized 语法2.2 上下文切换-synchronized理解2.3 synchronized 加在方法上3.变量的线程安全分析3.1 局部变量线程安全分析3.2 成员变量线程安全分析3.3 局部变量暴露引用1.共享带来的问题1.1 小故事1.2 Java代码原创 2022-03-06 17:39:57 · 654 阅读 · 0 评论 -
synchronized关键字的用法、使用wait及notify方法实现线程间的通信
文章目录1.多线程的同步2.synchronized修饰方法3.synchronized修饰static方法4.synchronized代码块5.小结6.wait及notify方法解读1.多线程的同步为什么要引入同步机制在多线程环境中,可能会有两个甚至更多的线程试图同时 访问一个有限的资源。必须对这种潜在资源冲突进行预防。解决方法:在线程使用一个资源时为其加锁即可。访问资 源的第一个线程为其加上锁以后,其他线程便不能再使用 那个资源,除非被解锁。问题代码举例俩个线程同时取账户的钱/**原创 2022-03-05 17:07:50 · 766 阅读 · 0 评论 -
创建线程的三种方式、线程运行原理、常见方法、线程状态
文章目录1.创建线程的三种方式1.1 继承Thread类并重写run方法1.2 使用Runnable配合Thread1.3 通过Callable和FutureTask创建线程2.Runnable和Thread的区别3.Thread类源代码剖析4.线程运行原理4.1 栈与栈帧1.创建线程的三种方式1. 继承Thread类并重写run方法。2. 实现Runnable接口,然后实现其run方法。3. 通过Callable和Future创建线程。将我们希望线程执行的代码放到 run 方法中,然后通过 st原创 2022-03-04 22:11:07 · 3388 阅读 · 0 评论 -
线程与进程、并行并发、同步异步概念
文章目录1.线程与进程、并行并发、同步异步概念1.1 线程与进程1.线程与进程、并行并发、同步异步概念1.1 线程与进程进程程序由指令和数据组成,但是这些 指令要运行,数据要读写,就必须将指令加载到cpu,数据加载至内存。在指令运行过程中还需要用到磁盘,网络等设备。进程就是用来加载指令,管理内存,管理IO的当一个指令被运行,从磁盘加载这个程序的代码到内存,这时候就开启了一个进程进程就可以视为程序的一个实例,大部分程序都可以运行多个实例进程(例如记事本,浏览器等),也有的程序只能启动一个实例进程原创 2022-03-01 20:18:42 · 336 阅读 · 0 评论