![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
concurrent(j.u.c)
文章平均质量分 64
Dongguabai
这个作者很懒,什么都没留下…
展开
-
小议CompletableFuture 链式执行和响应式编程
本文以一个实际的场景设计问题为出发点,详细探讨了的链式执行机制,对执行流程和线程切换进行了深入的分析,并对响应式编程的概念和应用进行了简单的讨论。原创 2024-01-12 00:27:42 · 2494 阅读 · 0 评论 -
每天学习一点点之 Java 七大阻塞队列之 LinkedBlockingQueue(理解线程安全)
本文简要分析了的写、取、容量查询、遍历四种操作的源码,发现写和取作为更新类操作,是可以保证线程安全的,但是查询容量在多线程环境下返回的结果并不一定可靠,而遍历操作同样作为查询类操作却是可以保证遍历期间数据的准确性。本文也是基于对的写、取、查询三类操作的源码分析表达一个个人观点我们讨论线程安全于不安全的时候,一定要注意共有变量的使用场景,忽略这个场景去讨论所谓的线程安全与不安全是没有意义的,就好比和我们总会说它们是“线程安全”的List但真的在任何场景下它们的“线程安全”都是一样的嘛?......原创 2022-07-24 00:55:03 · 897 阅读 · 0 评论 -
实现一个简单的 CountDownLatch Demo
现在很多框架或者中间件由于多次迭代、优化和兼容、扩展处理,最核心的设计思想和原理很容易就被覆盖,导致我们想学习的时候就不太容易抓住主干。先不看各种原理,就基与 CountDownLatch 提供的功能使用最简单的方式去实现 CountDownLatch:package dongguabai.concurrent;/** * @author Dongguabai * @description * @date 2022-04-25 12:38 */public class MyCountD.原创 2022-04-25 13:06:10 · 407 阅读 · 0 评论 -
从 Nacos 在单核 Docker 容器下 403 异常来看调度线程池的执行流程
今天组内同事在群里分享了一个最近使用 Nacos 的异常,现象就是系统启动超过 5 个小时后,使用 Nacos 会返回403 错误。系统重启后问题会暂时消失。Nacos 版本为 2.0.3,使用的 Docker 容器规格为 1 核 4G。最后更改了容器的规格为 4 核心 16G 后问题解决。之前没有研究过 Nacos 的源码,看了下同事的分享内容,大概知道了 Nacos 有一个 Token 机制(可能是做服务端和客户端的安全验证),过期时间是 18000s(即 5h)。Token 的刷新机制就是有一个调度原创 2022-01-22 21:41:20 · 1100 阅读 · 2 评论 -
每天学习一点点之从 Cached 线程池到线程池的一些细节(执行、超时关闭等)
相关文章:每天学习一点点之 Java 七大阻塞队列之 SynchronousQueue前天研究了一下 SynchronousQueue,那么必然不能忽略 Cached 线程池,因为它使用的阻塞队列就是 SynchronousQueue,所以今天就来探讨下 Cached 线程池(不过单独拧出 Cached 线程池其实意义不大,主要还是将 Cached 线程池作为一个切入点来分析 JUC 中的线程池) 。线程池先看构造: public static ExecutorService newCac原创 2021-09-05 20:36:43 · 474 阅读 · 0 评论 -
每天学习一点点之 Java 七大阻塞队列之 SynchronousQueue
今天组内一位同学在优化报表服务的方案中使用到了SynchronousQueue ,看了之后受益匪浅,也感觉是时候把之前列了标题但一直没写的这篇文章补充了:其实SynchronousQueue 是一个特别有意思的阻塞队列,就我个人理解来说,它很重要的特点就是没有容量。直接看一个例子:package dongguabai.test.juc.test;import java.util.concurrent.SynchronousQueue;/** * @author Dongguabai.原创 2021-09-02 21:59:53 · 358 阅读 · 0 评论 -
关于 CompletableFuture 因为拒绝策略无限等待的解决思路
先简答说明一下上下文:我就是想实现等待多个异步任务都执行完成的操作,同时搜集到每个任务的执行结果,当然可以使用线程池+CountDownLauncher,但是我个人更倾向于使用 CompletableFuture 来实现;很明显要使用CompletableFuture.allOf().join() 来做;CompletableFuture 默认使用的是 ForkJoin 线程池,我个人倾向于自定义线程池;自定义线程池拒绝策略是肯定要考虑的;今天这个问题就出在拒绝策略上。这里偷个懒,直接将我之原创 2021-08-07 15:33:47 · 10815 阅读 · 3 评论 -
wait/notify 一个细节
notify的确是可以唤醒,但是要注意的是唤醒后还是要抢锁才能进行坐后面的事情,例子如下:package linkedlist.questions;import java.io.IOException;import java.util.Date;import java.util.concurrent.TimeUnit;/** * @author Dongguabai * @description * @date 2021-04-08 17:00 */public class Te原创 2021-04-08 17:14:48 · 87 阅读 · 0 评论 -
一个简单的死锁例子
代码如下:package com.example.demo.service;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * @author Dongguabai * @description * @date 2021-03-28 12:18 */public class Test2 { static Lock lock1 = new Ree原创 2021-03-28 12:27:40 · 376 阅读 · 0 评论 -
自定义实现 AtomicInteger 类
其实获得了 Unsafe 之后直接调 API 就行。package dongguabai.atomic;import org.springframework.objenesis.instantiator.util.UnsafeUtils;import sun.misc.Unsafe;/** * @author Dongguabai * @description * @date 2021-02-21 19:53 */public class MyAtomicInteger {原创 2021-02-21 20:20:22 · 168 阅读 · 0 评论 -
基于 CAS 操作实现一个简单的锁
这里基于 AtomicInteger 来实现:package dongguabai.cas;import java.util.concurrent.atomic.AtomicInteger;/** * @author Dongguabai * @description * @date 2021-02-21 18:53 */public class CasLock { /** * 0 表示未加锁,1表示已锁 */ private AtomicInteg原创 2021-02-21 19:02:33 · 2232 阅读 · 4 评论 -
为什么要这样写 final ReentrantLock lock = this.lock; ?
今天JVMPocket天方夜谭群里的一个朋友问了个问题,为什么CyclicBarrier的代码要这样写: final ReentrantLock lock = this.lock; lock.lock;其实如果阅读过java.util.concurrent包下源码的童鞋会发现,不止CyclicBarrier源码是这样做的,这个包下,所有以final修饰的成员变量读取的代码大部分情况都是这样写的,大部分指情况的是:全部的循环代码块里(while、for)读取这些final的成员变量的时候;转载 2021-02-20 18:45:28 · 597 阅读 · 0 评论 -
FutureTask 中 get(timeout) 的超时是怎么玩的?
FutureTask 中 get(timeout) 的超时是怎么玩的?昨天晚上在一个交流群里一位群友提出了一个问题,他想实现一种客户端功能,可以让客户端调用其他接口的时候,如果超时,就返回 null。这个问题好处理,直接使用 Future 即可,即这个方法:public interface Future<V> { V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionExcep原创 2021-01-07 10:43:34 · 6751 阅读 · 0 评论 -
JOL:查看Java 对象布局、大小工具
一 概述最近需求,打算再内存缓存数据,数据量130000万并且还会增加,了解这些数据占用空间的大小是很常见的监控需要。常规方式,人工可以按照Java基础数据类型大小及内容大小估算出缓存对象的大概堆占用,但是麻烦还不准。OpenJDK,提供了JOL包,可以帮我们在运行时计算某个对象的大小,是非常好的工具官网:http://openjdk.java.net/projects/code-tools/jol/定位:分析对象在JVM的大小和分布依赖:<dependency&g.转载 2020-12-18 10:11:13 · 1038 阅读 · 0 评论 -
手写穷人版线程池
Java 的多线程技术也是逐步发展的,在 JDK1.2 之前,其实 Java 的 Thread 还是基于 Green Thread 模拟的多线程并发,在 JDK1.2 之后才有了基于 OS 的 Thread 的 1:1 线程映射模型。JUC 是 JDK1.5 才出来的,在 JDK1.5 之前,业界前辈都是自定义的线程池,如 Tomcat 5.5 之前是通过自定义线程池去进行线程的管理。线程池本身设计其实是很复杂的,本文主要就是基于 JUC 中的线程池,写一个穷人版的线程池,从而体会其中的原理。JUC 中原创 2020-11-29 19:59:14 · 147 阅读 · 0 评论 -
诡异的java.lang.IllegalMonitorStateException
转自:https://blog.csdn.net/historyasamirror/article/details/6709693今天的一段代码抛出了java.lang.IllegalMonitorStateException,代码如下: private boolean wait = false; public boolean pleaseWait() { synchronize...转载 2018-11-16 17:30:23 · 267 阅读 · 0 评论 -
Thread 类中的几个细节(一)
相关博客:Thread 类中的几个细节(二)构造 Thread 类先看这么一段代码:package com.example.threaddesign;/** * @author Dongguabai * @date 2018/12/2 20:58 */public class ThreadTest { public static void main(Stri...原创 2018-12-03 18:48:20 · 347 阅读 · 0 评论 -
关于 IllegalMonitorStateException
相关博客:并发编程学习之wait()和notify()今天在写一个小 Demo 的时候出现了这个异常:package com.example.threaddesign;/** * @author Dongguabai * @date 2018/12/5 20:33 */public class ExceptionDemo { private volatile s...原创 2018-12-05 20:44:14 · 339 阅读 · 0 评论 -
再看 synchronized
相关博客:使用synchronized要注意的地方先看这个示例:package com.example.threaddesign;/** * @author Dongguabai * @date 2018/12/4 17:33 */public class SynchronizedTest2 { private static final Object LOCK ...原创 2018-12-05 14:53:42 · 394 阅读 · 0 评论 -
Thread 中用到的两种设计模式
其实有时候不能简单说哪种设计用到了哪些设计模式,设计模式本身就是对很多代码设计经验的总结。模板模式模板模式的应用就比较好理解了。在创建线程一般使用构建 Thread 类或者实现 Runnable 接口(这种说法是错误的,最起码是不严谨的,在 JDK 中代表线程的就只有 Thread 这个类,线程的执行单元就是 run() 方法,你可以通过继承 Thread 然后重写 run() 方法实现自...原创 2018-12-02 21:04:38 · 3031 阅读 · 0 评论 -
使用优雅方式结束线程
方式一设置一个是否结束的标志(开关)。package com.example.threaddesign;/** * @author Dongguabai * @date 2018/12/4 15:16 */public class StopThread1 { private static volatile boolean stop = true; publ...原创 2018-12-04 16:40:28 · 297 阅读 · 0 评论 -
多线程的一个面试题
public static void main(String[] args) { new Thread(()->{ System.out.println("==============="); }){ @Override public void run() { ...原创 2018-12-04 15:45:22 · 160 阅读 · 0 评论 -
一个线程不安全的例子
package com.example.demoClient.lg;/** * @author Dongguabai * @date 2018/11/10 16:53 */public class Demo3 { private int value = 1; public static void main(String[] args) { Demo...原创 2018-11-10 18:07:10 · 2387 阅读 · 0 评论 -
重入锁之公平性
公平是针对锁的获取而言的,如果一个锁是公平的,那么锁的获取顺序就应该符合请求的绝对时间顺序。这样就需要内部维护一个FIFO队列,Object有个wait()和notify()方法(具体可参看https://blog.csdn.net/Dongguabai/article/details/82230279),但是notify()是随机释放一个,那么我们如何保证释放的是队列中的第一个呢。那就对不同...原创 2018-11-17 20:02:02 · 306 阅读 · 0 评论 -
使用AQS实现自己的重入锁(独占、非公平)
相关博客:https://blog.csdn.net/Dongguabai/article/details/84178241https://blog.csdn.net/Dongguabai/article/details/82691626https://blog.csdn.net/Dongguabai/article/details/82461675https://blog.csd...原创 2018-11-17 16:36:50 · 288 阅读 · 0 评论 -
再看AbstractQueuedSynchronizer
相关博客:https://blog.csdn.net/Dongguabai/article/details/82691626https://blog.csdn.net/Dongguabai/article/details/82461675 主要对之前的学习进行一个补充。AbstractQueuedSynchronizer是实现同步容器的基础。在JUC中是一个非常主要的类,JDK...原创 2018-11-17 14:23:04 · 140 阅读 · 0 评论 -
Java-Lock超时锁和可中断锁原理
转自:https://blog.csdn.net/zhangdong2012/article/details/81151682个人理解记录超时锁的基本原理与独占锁基本相同,不同之处在于“超时”,在调用doAcquireNanos时,首先记录下调用方法的时间,然后尝试获取锁,如过获取成功则直接返回,如果获取失败,判断超时时间是否为0,如果是,则时间超时,返回false,如果不是,则获取当前时...转载 2018-11-16 19:25:42 · 823 阅读 · 0 评论 -
基于wait()和notify()实现自己的简易Lock
这个是基于wait()和notify()实现的一个简易版本:package com.example.demoClient;/** * @author Dongguabai * @date 2018/11/16 15:42 */public class MyLock{ //判断是否有线程拿到锁 private volatile Boolean isLocked =...原创 2018-11-16 19:19:37 · 294 阅读 · 0 评论 -
Thread 类中的几个细节(二)
相关博客:Thread 类中的几个细节(一)Thread 类中有这样一个构造函数:Threadpublic Thread(ThreadGroup group, Runnable target, String name, long stackSize)分配新的 Thread 对象,以便将 ta...原创 2018-12-03 21:23:56 · 211 阅读 · 0 评论 -
wait() 和 notify() 的一个疑问
相关博客:并发编程学习之wait()和notify()在 wati() 方法中有这样一段描述:public final native void wait(long timeout) throws InterruptedException;This method causes the current thread (call it T) toplace itself in the w...原创 2018-12-14 17:55:54 · 222 阅读 · 0 评论 -
死锁对系统有什么影响
死锁的原因就不多说了,那死锁究竟对系统有什么影响呢。先看下面一段代码:package com.example.demo.controller;/*** 一个简单的死锁类 * 当DeadLock类的对象flag==1时(td1),先锁定o1,睡眠500毫秒 * 而td1在睡眠的时候另一个flag==0的对象(td2)线程启动,先锁定o2,睡眠500毫秒 * td1睡眠结束后需要...原创 2018-12-11 10:56:06 · 1225 阅读 · 0 评论 -
并发编程学习之线程中断
一般来说,线程在执行完毕后就会结束,无须手动关闭。但是,凡是也有例外,一些服务端的后台程序可能会常驻系统,它们通常不会正常终结。比如,他们的执行体本身就是一个大的无穷循环。先来个总结:一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以,Thread.stop, Thread.suspend, Thread.resume 都已经被废弃了。stop()在Thread...原创 2018-09-02 23:39:00 · 287 阅读 · 0 评论 -
CompletableFuture实战
Future 模式是一种非常有用的设计思想。之前的两篇文章分别介绍了 Java 中 Future 模式实现的改进版 CompletionService (Future 模式(一)- Java 并发编程之 CompletionService)和如何实现自己的两种 Future 模式(Future 模式(二))。在 Java 8 中提供了一个更牛逼的 Future 模式实现:CompletableFu...原创 2019-09-22 08:46:47 · 861 阅读 · 0 评论 -
线程池中的空余线程是如何被回收的
首先要知道在线程池中空余线程被回收的条件:当线程池中的线程数量大于 corePoolSize 的时候,如果这时没有新的任务提交,核心线程外的线程不会立即销毁,而是会等待,直到等待的时间超过 keepAliveTime。文章地址:https://mp.weixin.qq.com/s?__biz=MzU1OTgyMDc3Mg==&mid=2247483834&idx=1&s...原创 2019-03-27 14:31:04 · 5849 阅读 · 1 评论 -
Future 模式
Future 模式说白了就是异步执行任务,同步获取结果,当然也可以升级为异步执行任务,任务执行完成后执行回调操作。文章地址:https://mp.weixin.qq.com/s?__biz=MzU1OTgyMDc3Mg==&mid=2247483818&idx=1&sn=c2d9f6ef447d3affc40e394ea4c8bdb8&chksm=fc103...原创 2019-03-24 17:31:55 · 167 阅读 · 0 评论 -
多线程交替打印 1-10 数字
From:松哥package dongguabai.demo.testing;/** * Create by Kenson on 2019/4/3 */public class ThreadTest { public static void main(String[] args) { ThreadModel testThread1 = new Thread...原创 2019-04-04 10:08:56 · 1788 阅读 · 0 评论 -
Java 并发编程之 CompletionService
CompletionService 主要是可以帮我们解决在多线程批处理任务的时候不必等到所有任务都完成后才能获取执行结果,而是可以直接获取已完成任务的结果。文章地址:https://mp.weixin.qq.com/s/YWwSTM2ZJEMcZ6hMz7lD5g欢迎关注公众号:...原创 2019-03-22 23:35:59 · 247 阅读 · 0 评论 -
Java 线程池,isShutDown、isTerminated 的作用与区别
相关博客:线程池 shutdown 和 shutdownNow 的区别 转自:https://blog.csdn.net/u010002184/article/details/79188403isShutDown当调用shutdown()或shutdownNow()方法后返回为true。 isTerminated当调用shutdown()方法后,并且所有提交的任务完成后返回为tr...转载 2019-01-27 13:01:55 · 1593 阅读 · 2 评论 -
一个指令重排序的例子
package test.demo2;/** * @author Dongguabai * @date 2019/1/7 13:21 */public class SynchronizedDemo { // 共享变量 private boolean flag = false; private int a = 1; private int result = 0; //syn...原创 2019-01-07 14:28:07 · 1024 阅读 · 0 评论 -
一个线程可见性的例子
package test.demo2;/** * @author Dongguabai * @date 2019/1/7 13:21 */public class ThreadDemo extends Thread { private Boolean stop = false; public static void main(String[] args) thr...原创 2019-01-07 13:35:44 · 348 阅读 · 1 评论