java并发编程
文章平均质量分 80
java并发编程笔记
过去日记
在校大学生,csdn平台优质作者,华为云云享专家,阿里云专家博主,曾获得华为昇腾AI创新大赛优秀奖,黄河鲲鹏省赛银奖,全国大学生电子设计大赛省一等奖,擅长java方面spring boot后端开发,对新兴的go和rust也非常感兴趣
展开
-
java并发编程十六 CountdownLatch介绍
其中构造参数用来初始化等待计数值,await() 用来等待计数归零,countDown() 用来让计数减一。用来进行线程同步协作,等待所有线程完成倒计时。可以配合线程池使用,改进如下。可以配合线程池使用,改进如下。原创 2024-01-01 12:31:26 · 2396 阅读 · 0 评论 -
java并发编程十五 ReentrantReadWriteLock和StampedLock介绍
lock in share mode 提供一个 数据容器类 内部分别使用读锁保护数据的 read() 方法,写锁保护数据的 write() 方法。乐观读,StampedLock 支持 tryOptimisticRead() 方法(乐观读),读取完毕后需要做一次 戳校验 如果校验通过,表示这期间确实没有写操作,数据可以安全使用,如果校验没通过,需要重新获取读锁,保证数据安全。提供一个 数据容器类 内部分别使用读锁保护数据的 read() 方法,写锁保护数据的 write() 方法。测试 读-读 可以优化。原创 2023-12-30 09:34:07 · 985 阅读 · 0 评论 -
java并发编程十四 Fork/Join
然后提交给 ForkJoinPool 来执行。原创 2023-12-29 08:37:11 · 1704 阅读 · 0 评论 -
java并发编程十三 线程池
步骤1:自定义拒绝策略接口@FunctionalInterface // 拒绝策略步骤2:自定义任务队列@Slf4j// 1. 任务队列// 2. 锁// 3. 生产者条件变量// 4. 消费者条件变量// 5. 容量// 带超时阻塞获取try {// 将 timeout 统一转换为 纳秒try {// 返回值是剩余时间return t;// 阻塞获取try {try {return t;// 阻塞添加try {try {原创 2023-12-29 08:36:01 · 1578 阅读 · 0 评论 -
java并发编程十二 共享模型之不可变
结果发现也没有,构造新字符串对象时,会生成新的 char[] value,对内容进行复制。这种通过创建副本对象来避免共享的手段称之为【保护性拷贝(defensive copy)】如果一个对象在不能够修改其内部状态(属性),那么它就是线程安全的,因为不存在并发修改啊!另一个大家更为熟悉的 String 类也是不可变的,以它为例,说明一下不可变设计的要素。下面的代码在运行时,由于 SimpleDateFormat 不是线程安全的。发现该类、类中所有属性都是 final 的。原创 2023-12-28 09:28:09 · 940 阅读 · 0 评论 -
java并发编程十一 原子累加器和Unsafe
Unsafe 对象提供了非常底层的,操作内存、线程的方法,Unsafe 对象不能直接调用,只能通过反射获得。原创 2023-12-25 13:28:27 · 1611 阅读 · 6 评论 -
java并发编程十 ABA 问题及解决,原子数组和字段更新
它指的是一个共享变量的值在操作期间从A变为B,然后再从B变回A,而CAS操作可能会错误地认为没有其他线程修改过这个值。AtomicStampedReference 可以给原子引用加上版本号,追踪原子引用整个的变化过程,如: A -> B -> A ->C,通过AtomicStampedReference,我们可以知道,引用变量中途被更改了几次。只要有其它线程【动过了】共享变量,那么自己的 cas 就算失败,这时,仅比较值是不够的,需要再加一个版本号 AtomicStampedReference。原创 2023-12-26 10:08:58 · 1692 阅读 · 0 评论 -
java并发编程九 CAS 与 volatile和原子整数与原子引用
它可以用来修饰成员变量和静态成员变量,他可以避免线程从自己的工作缓存中查找变量的值,必须到主存中获取它的值,线程操作 volatile 变量都是直接操作主存。在java并发编程七六中,可以看到的 AtomicInteger 的解决方法,内部并没有用锁来保护共享变量的线程安全。那么它是如何实现的呢?其中的关键是 compareAndSet,它的简称就是 CAS (也有 Compare And Swap 的说法),它必须是原子操作。获取共享变量时,为了保证该变量的可见性,需要使用 volatile 修饰。原创 2023-12-27 09:25:31 · 1533 阅读 · 4 评论 -
java并发编程八 无锁解决加锁问题
有如下需求,保证 account.withdraw 取款方法的线程安全。首先想到的是给 Account 对象加锁。原有实现并不是线程安全的。withdraw 方法。原创 2023-12-27 10:22:08 · 1530 阅读 · 1 评论 -
java并发编程七 共享模型之内存
因为 t 线程要频繁从主内存中读取 run 的值,JIT 编译器会将 run 的值缓存至自己工作内存中的高速缓存中,减少对主存中 run 的访问,提高效率。1 秒之后,main 线程修改了 run 的值,并同步至主存,而 t 是从自己工作内存中的高速缓存中读取这个变量的值,结果永远是旧值。这种情况下是:线程2 执行 ready = true,切换到线程1,进入 if 分支,相加为 0,再切回线程2 执行 num = 2。I_Result 是一个对象,有一个属性 r1 用来保存结果,问,可能的结果有几种?原创 2023-12-26 10:09:16 · 1572 阅读 · 1 评论 -
java并发编程六 ReentrantLock,锁的活跃性
一间大屋子有两个功能:睡觉、学习,互不相干。现在小南要学习,小女要睡觉,但如果只用一间屋子(一个对象锁)的话,那么并发度很低解决方法是准备多个房间(多个对象锁)将锁的粒度细分。原创 2023-12-28 09:29:42 · 1874 阅读 · 0 评论 -
java并发编程五 Monitor 概念,api介绍与线程状态转换
obj.wait() 让进入 object 监视器的线程到 waitSet 等待obj.notify() 在 object 上正在 waitSet 等待的线程中挑一个唤醒obj.notifyAll() 让 object 上正在 waitSet 等待的线程全部唤醒它们都是线程之间进行协作的手段,都属于 Object 对象的方法。必须获得此对象的锁,才能调用这几个方法log.debug("执行....");// 让线程在obj上一直等待下去。原创 2023-12-21 00:00:00 · 2317 阅读 · 1 评论 -
java并发编程四 synchronized锁对象分析和变量线程线程安全分析
这里说它们是线程安全的是指,多个线程调用它们同一个实例的某个方法时,是线程安全的。所谓的“线程八锁”,其实就是考察 synchronized 锁住的是哪个对象。成员变量和静态变量是否线程安全?局部变量是否线程安全?原创 2023-12-20 09:22:33 · 2677 阅读 · 3 评论 -
java并发编程三 共享内存的问题和synchronized解决方案
老王说 [ 小南,你的时间到了,该别人了,记住结果走吧 ],于是小南念叨着 [ 结果是1,结果是1…最近执行的计算比较复杂,需要存储一些中间结果,而学生们的脑容量(工作内存)不够,所以老王申请了一个笔记本(主存),把一些中间结果先记在本上。这时小女的时间也用完了,老王又叫醒了小南:[小南,把你上次的题目算完吧],小南将他脑海中的结果 1 写入了笔记本。老王说 [ 小女,该你了 ],小女看到了笔记本上还写着 0 做了一个 -1 运算,将结果 -1 写入笔记本。但是由于分时系统,有一天还是发生了事故。原创 2023-12-30 09:35:13 · 1787 阅读 · 1 评论 -
java并发编程二 Java 线程的基本概念
当 Context Switch 发生时,需要由操作系统保存当前线程的状态,并恢复另一个线程的状态,Java 中对应的概念就是程序计数器(Program Counter Register),它的作用是记住下一条 jvm 指令的执行地址,是线程私有的。有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束.程序在 t1 线程运行,FileReader.read() 方法调用是异步的。打断 sleep 的线程, 会清空打断状态,以 sleep 为例。原创 2023-12-12 00:00:00 · 2967 阅读 · 2 评论 -
java并发编程一 并发编程的基本概念
单核 cpu 下,线程实际还是 串行执行 的。操作系统中有一个组件叫做任务调度器,将 cpu 的时间片(windows下时间片最小约为 15 毫秒)分给不同的程序使用,只是由于 cpu 在线程间(时间片很短)的切换非常快,人类感觉是 同时运行的。总结为一句话就是:微观串行,宏观并行,多核 cpu下,每个 核(core) 都可以调度运行线程,这时候线程可以是并行的。一般会将这种 线程轮流使用 CPU 的做法称为并发, concurrent。原创 2023-12-31 10:45:42 · 946 阅读 · 7 评论