
JUC
文章平均质量分 92
JUC
BirdMan98
心有灵犀一点通
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【并发编程】【20】【共享模型之工具】 JUC BlockingQueue ConcurrentLinkedQueue CopyOnWriteArrayList
当节点总数大于 2 时(包括 dummy 节点),putLock 保证的是 last 节点的线程安全,takeLock 保证的是head 节点的线程安全。两把锁保证了入队和出队没有竞争。当节点总数等于 1 时(就一个 dummy 节点)这时 take 线程会被 notEmpty 条件阻塞,有竞争,会阻塞。当节点总数等于 2 时(即一个 dummy 节点,一个正常节点)这时候,仍然是两把锁锁两个对象,不会竞争。的思想,增删改操作会将底层数组拷贝一份,更改操作在新数组上执行,这时不影响其它线程的。原创 2023-03-21 00:11:58 · 94 阅读 · 0 评论 -
【并发编程】【19】【共享模型之工具】 JUC ConcurrentHashMap
扩容,扩容时以 bin 为单位进行,需要对 bin 进行 synchronized,但这时妙的是其它竞争线程也不是无事可做,它们会帮助把其它 bin 进行扩容,扩容时平均只有 1/6 的节点会把复制到新 table 中。树化,当 table.length < 64 时,先尝试扩容,超过 64 时,并且 bin.length > 8 时,会将链表树化,树化过程会用 synchronized 锁住链表头。一是提供一个 map 集合,用来存放每个单词的计数结果,key 为单词,value 为计数。原创 2023-03-20 02:25:03 · 177 阅读 · 0 评论 -
【并发编程】【18】【共享模型之工具】JUC Semaphore CountDownLatch CyclicBarrier 线程安全集合类
[ˈsɛməˌfɔr] 信号量,用来限制能同时访问共享资源的线程上限。输出*Semaphore 应用2. 限制对共享资源的使用semaphore 实现使用 Semaphore 限流,在访问高峰期时,让请求线程阻塞,高峰期过去再释放许可,当然它只适合限制单机线程数量,并且仅是限制线程数,而不是限制资源数(例如连接数,请对比 Tomcat LimitLatch 的实现)用 Semaphore 实现简单连接池,对比『享元模式』下的实现(用wait notify),性能和可读性显然更好,注意下面的实现中线程原创 2023-03-20 02:22:15 · 156 阅读 · 0 评论 -
【并发编程】【17】【共享模型之工具】JUC ReentrantReadWriteLock 缓存应用 读写锁原理 StampedLock
t3 进入 sync.releaseShared(1) 中,调用 tryReleaseShared(1) 让计数减一,这回计数为零了,进入doReleaseShared() 将头节点从 -1 改为 0 并唤醒老二,即。这时会走到写锁的 sync.release(1) 流程,调用 sync.tryRelease(1) 成功,变成下面的样子。如果校验通过,表示这期间确实没有写操作,数据可以安全使用,如果校验没通过,需要重新获取读锁,保证数据安全。原创 2023-03-20 02:19:29 · 109 阅读 · 0 评论 -
【并发编程】【16】【共享模型之工具】 JUC AQS原理 ReentrantLock原理
全称是。原创 2023-03-20 02:16:55 · 125 阅读 · 0 评论 -
【并发编程】【15】【共享模型之工具】线程池 ThreadPoolExecutor 二 工作线程模式 任务调度线程池 正确处理执行任务异常 Tomcat线程池 ForkJoin
让有限的工作线程(Worker Thread)来轮流异步处理无限多的任务。也可以将其归类为分工模式,它的典型实现就是线程池,也体现了经典设计模式中的享元模式。例如,海底捞的服务员(线程),轮流处理每位客人的点餐(任务),如果为每位客人都配一名专属的服务员,那么成本就太高了(对比另一种多线程设计模式:Thread-Per-Message)注意,原创 2023-03-19 19:52:13 · 168 阅读 · 0 评论 -
【并发编程】【14】【共享模型之工具】线程池 自定义线程池 ThreadPoolExecutor 一
步骤1:自定义拒绝策略接口。原创 2023-03-19 19:50:42 · 126 阅读 · 0 评论 -
【并发编程】【13】【共享模型之不可变】 日期转换问题 不可变设计 无状态
英文名称:Flyweight pattern. 当需要重用数量有限的同一类对象时。原创 2023-03-19 00:04:23 · 82 阅读 · 0 评论 -
【并发编程】【12】【共享模型之无锁】 原子数组 字段更新器 原子累加器 Unsafe
这样它们在累加时操作的不同的 Cell 变量,因此。原创 2023-03-19 17:18:33 · 87 阅读 · 0 评论 -
【并发编程】【11】【共享模型之无锁】CAS与Volatile 原子整数 原子引用
但无锁情况下,因为线程要保持运行,需要额外 CPU 的支持,CPU 在这里就好比高速跑道,没有额外的跑道,线程想高速运行也无从谈起,虽然不会进入阻塞,但由于没有分到时间片,仍然会进入可运行状态,还是会导致上下文切换。无锁情况下,即使重试失败,线程始终在高速运行,没有停歇,而 synchronized 会让线程在没有获得锁的时候,发生上下文切换,进入阻塞。synchronized 是基于悲观锁的思想:最悲观的估计,得防着其它线程来修改共享变量,我上了锁你们都别想改,我改完了解开锁,你们才有机会。原创 2023-03-19 00:04:34 · 87 阅读 · 0 评论 -
【并发编程】【10】【共享模型之内存】Java内存模型 可见性 有序性
Balking (犹豫)模式用在一个线程发现另一个线程或本线程已经做了某一件相同的事,那么本线程就无需再做了,直接结束返回。原创 2023-03-18 19:52:31 · 95 阅读 · 0 评论 -
【并发编程】【9】【共享模型之管程】ReentrantLock
线程 1 输出 a 5 次,线程 2 输出 b 5 次,线程 3 输出 c 5 次。第二,如果有些干扰线程错误地 notify 了 wait 线程,条件不满足时还要重新等待,使用了 while 循环来解决此问题。最后,唤醒对象上的 wait 线程需要使用 notifyAll,因为『同步对象』上的等待线程可能不止一个。可重入是指同一个线程如果首次获得了这把锁,那么因为它是这把锁的拥有者,因此有权利再次获取这把锁。学会分析变量的线程安全性、掌握常见线程安全类的使用(hashtable,vector)原创 2023-03-18 19:42:11 · 92 阅读 · 0 评论 -
【并发编程】【8】【共享模型之管程】 线程状态转换 多把锁 活跃性
调用 LockSupport.unpark(目标线程) 或调用了线程 的 interrupt() ,或是等待超时,会让目标线程从TIMED_WAITING–> RUNNABLE。调用 LockSupport.unpark(目标线程) 或调用了线程 的 interrupt() ,会让目标线程从 WAITING --> RUNNABLE。等待时间超过了 n 毫秒,或调用 obj.notify() , obj.notifyAll() , t.interrupt() 时。原创 2023-03-18 19:41:22 · 77 阅读 · 0 评论 -
【并发编程】【7】【共享模型之管程】 Wait & Notify Park & Unpark
obj.wait() 让进入 object 监视器的线程到 waitSet 等待obj.notify() 在 object 上正在 waitSet 等待的线程中挑一个唤醒obj.notifyAll() 让 object 上正在 waitSet 等待的线程全部唤醒它们都是线程之间进行协作的手段,都属于 Object 对象的方法。必须获得此对象的锁,才能调用这几个方法。原创 2023-03-18 19:36:56 · 94 阅读 · 0 评论 -
【并发编程】【6】【共享模型之管程】 Monitor Synchronized原理进阶
小南和小女商量了一下,约定不锁门了,而是谁用房间,谁把自己的书包挂在门口,但他们的书包样式都一样,因此每次进门前得翻翻书包,看课本是谁的,如果是自己的,那么就可以进门,这样省的上锁解锁了。于是,小南干脆在门上刻上了自己的名字:【小南专属房间,其它人勿用】,下次来用房间时,只要名字还在,那么说明没人打扰,还是可以安全地使用房间。如果在尝试加轻量级锁的过程中,CAS 操作无法成功,这时一种情况就是有其它线程为此对象加上了轻量级锁(有竞争),这时需要进行锁膨胀,将轻量级锁变为重量级锁。于是整个类的所有对象。原创 2023-03-18 19:27:58 · 102 阅读 · 0 评论 -
【并发编程】【5】【共享模型之管程】 共享问题 Synchronized 变量的线程安全
这中间即使 t1 的 cpu 时间片不幸用完,被踢出了门外(不要错误理解为锁住了对象就能一直执行下去哦),这时门还是锁住的,t1 仍拿着钥匙,t2 线程还在阻塞状态进不来,只有下次轮到 t1 自己再次获得时间片时才能开门进入。synchronized(对象) 中的对象,可以想象为一个房间(room),有唯一入口(门)房间只能一次进入一人进行计算,线程 t1,t2 想象成两个人。老王说 [ 小南,你的时间到了,该别人了,记住结果走吧 ],于是小南念叨着 [ 结果是1,结果是1…-- 原子性(不建议使用)原创 2023-03-18 19:12:38 · 119 阅读 · 0 评论 -
【并发编程】【4】【Java线程】Interrupt方法详解 不推荐的方法 主线程与守护线程 五种状态 六中状态 习题 本章小结
关系多了,错综复杂,千头万绪,往往出现“万事俱备,只欠东风”的情况。或往往因为抓的不是关键,连夜三班,急急忙忙,完成这一环节之后,还得等待旁的环节才能装配。有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。上面模拟的是小王等老王的水烧开了,小王泡茶,如果反过来要实现老王等小王的茶叶拿来了,老王泡茶呢?水开了之后,急急忙忙找茶叶,洗茶壶茶杯,泡茶喝。线程重要 api,如 start,run,sleep,join,interrupt 等。原创 2023-03-18 19:08:18 · 124 阅读 · 0 评论 -
【并发编程】【3】【Java线程】 创建运行线程 观察多个线程同时运行 查看线程 线程运行原理 常见方法 start与run sleep与yield join方法详解
当 Context Switch 发生时,需要由操作系统保存当前线程的状态,并恢复另一个线程的状态,Java 中对应的概念就是程序计数器(Program Counter Register),它的作用是记住下一条 jvm 指令的执行地址,是线程私有的。如果 cpu 比较忙,那么优先级高的线程会获得更多的时间片,但 cpu 闲时,优先级几乎没作用。不同的是,后两种都需要加锁,并且需要相应的唤醒操作,一般适用于要进行同步的场景。因为以下一些原因导致 cpu 不再执行当前的线程,转而执行另一个线程的代码。原创 2023-03-18 19:03:41 · 208 阅读 · 0 评论 -
【并发编程】【2】【进程与线程】进程与线程 并行与并发 应用
操作系统中有一个组件叫做任务调度器,将 cpu 的时间片(windows下时间片最小约为 15 毫秒)分给不同的程序使用,只是由于 cpu 在线程间(时间片很短)的切换非常快,人类感觉是 同时运行的。单核 cpu 下,多线程不能实际提高程序运行效率,只是为了能够在不同的任务之间切换,不同线程轮流使用cpu ,不至于一个线程总占用 cpu,别的线程没法干活。但如果是四核 cpu,各个核心分别使用线程 1 执行计算 1,线程 2 执行计算 2,线程 3 执行计算 3,那么 3 个线程是并行的,花费时间。原创 2023-03-18 18:56:58 · 144 阅读 · 0 评论 -
【并发编程】【1】【概览】 这门课讲什么 为什么学这门课 课程特色 预备知识
线程安全问题,需要你接触过 Java Web 开发、Jdbc 开发、Web 服务器、分布式框架时才会遇到。以及 Java 并发工具、并发问题以及解决方案,同时我也会讲解一些其它领域的并发。基于 JDK 8,最好对函数式编程、lambda 有一定了解。这门课中的【并发】一词涵盖了在 Java 平台上的。采用了 slf4j 打印日志,这是好的实践。本门课程以并发、并行为主线,穿插讲解。给每个线程好名字,这也是一项好的实践。logback.xml 配置如下。pom.xml 依赖如下。希望你不是一个初学者。原创 2023-03-18 18:51:20 · 95 阅读 · 0 评论