
并发编程
文章平均质量分 90
并发编程的第一原则:不要写并发程序。
秀强
物有本末,事有终始。
展开
-
【Java 面试题合集】ThreadPoolExecutor 线程池面试题
maximumPoolSize 最大线程数keepAliveTime 存活时间unit 时间单位workQueue 存放待执行任务的队列threadFactory 创建线程的工厂。创建线程或线程池时指定有意义的线程名称,方便出错时回溯。handler 拒绝策略项目中,我们会使用简单的线程隔离的方案,每个业务使用一个线程池。原创 2023-01-31 11:12:00 · 718 阅读 · 0 评论 -
【正本清源】Synchronized 源码全解之偏向锁的获取(基于 Openjdk12)
基于openjdk12的Synchronized锁升级过程之偏向锁的获取。原创 2023-01-29 15:20:20 · 637 阅读 · 0 评论 -
JDK8 ThreadPoolExecutor 线程池源码深度解析(附几种线程池的扩展方式)
实现 RejectedExecutionHandler 重写 rejectedExecution 方法。//自定义处理方式,可以先打个日志 xxx 被我拒绝了 然后我把它放到了 redis 里 ... //log("r rejected") //save r in kafka、mysql、redis } }// 自定义的线程池类,继承自ThreadPoolExecutor private EagerThreadPoolExecutor executor;原创 2022-09-06 20:20:50 · 570 阅读 · 0 评论 -
ConcurrentHashMap 中竟有好几个BUG?JDK8 源码深度解析
上述 sc < 0 的判断条件永远不可能进入,因为 sc 是 while 循环中的局部变量。因为 sc 的高 16 代表 rs,如果 sc 和 rs原创 2022-09-04 16:13:31 · 1131 阅读 · 2 评论 -
批量提交异步任务 CompletionService
文章目录获取价格与保存方法串行执行ThreadPoolExecutor+Future 优化使用 CompletionService 优化main使用 CompletionService 优化询价应用。获取价格与保存方法 private static Integer getPriceByS1() { try { Thread.sleep(10000); } catch (InterruptedException e) {原创 2020-05-29 15:49:48 · 434 阅读 · 0 评论 -
Synchronized 关键字原理及锁升级过程详解
文章目录对象头MarkWord锁升级无锁偏向锁轻量级锁重量级锁参考资料在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁。但 是,随着Java SE 1.6对synchronized进行了各种优化之后,有些情况下它就并不那么重了。从JVM规范中可以看到Synchonized在JVM里的实现原理,JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步是使用monitorenter 和monitorexit指令实现的,而方法原创 2020-05-21 14:48:55 · 444 阅读 · 0 评论 -
Java 常见创建线程的几种方式
文章目录常见几种方式Example常见几种方式继承 Thread 类实现 Runnable/Callable 接口线程池Exampleimport java.util.concurrent.*;public class TestThread { static class MyThread extends Thread{ @Override ...原创 2020-09-09 19:10:36 · 194 阅读 · 0 评论 -
图解Java线程死锁的必要条件
文章目录What is Deadlock发生死锁要如何解决如何预防死锁参考资料What is DeadlockIn concurrent computing, a deadlock is a state in which each member of a group is waiting for another member, including itself, to take action...原创 2020-04-29 19:50:28 · 329 阅读 · 0 评论 -
图解Java线程的生命周期模型
文章目录多线程运行状态JDK1.8 State多线程运行状态任何一个线程的对象都应该使用Thread类进行封装,所以线程的启动使用的是start(),但是启动的时候实际上若干个线程都将进入到一种就绪状态,现在并没有执行;进入到就绪状态之后就需要等待进行资源调度,当某一个线程调度成功之后则进入运行状态(run())方法,但是所有的线程不可能一直持续执行下去,中间需要产生一些暂停的状态,例如...原创 2020-09-09 19:10:49 · 296 阅读 · 0 评论 -
java 线程池 ThreadPoolExecutor 源码扩展 支持先增加非核心线程处理任务后放任务队列
文章目录继承体系七个参数RejectedExecutionHandlerCallerRunsPolicyAbortPolicyDiscardPolicyDiscardOldestPolicy继承体系七个参数 /** * Creates a new {@code ThreadPoolExecutor} with the given initial * paramet...原创 2020-03-12 20:59:24 · 280 阅读 · 0 评论 -
ThreadPoolExecutor源码解析
文章目录常见变量构造方法execute()方法addWorker()worker类runworker常见变量 //jdk源码中常见操作,高3位表示线程池状态,低29位表示worker数量 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); //Integer.SIZE = 32,所以 C...原创 2020-03-14 00:48:51 · 227 阅读 · 0 评论 -
Callable、Future、FutureTask 模拟烧水泡茶
文章目录CallableFutureExampleFutureTaskExampleCallable用法与Runnable相似,但是有返回值/** * A task that returns a result and may throw an exception. * Implementors define a single method with no arguments called...原创 2020-03-12 20:09:07 · 218 阅读 · 0 评论 -
多线程顺序打印A1B2C3到Z26
文章目录题目LockSupportCASenumAtomicIntegerBlockingQueuesynchronized_wait_notifyReentrantLock1个Condition2个ConditionLinkedTransferQueue题目用线程顺序打印A1B2C3…Z26LockSupportimport java.util.concurrent.locks.Lock...原创 2020-03-10 23:17:30 · 1283 阅读 · 1 评论 -
jdk8 ReentrantLock API 快速上手(配测试代码)
文章目录ReentrantLocktryLocklockInterruptibly()公平锁ReentrantLockReentrantlock可用于替代synchronizedReentrantLock是显式锁,锁的持有和释放都必须手动编写(重要的事情说三遍)。使用synchronized锁定的话如果遇到异常,jvm会自动释放锁,但是lock必须手动释放锁,因此经常在finally中进...原创 2020-09-09 19:12:06 · 389 阅读 · 0 评论 -
volatile关键字
文章目录volatile总结参考文章volatilevolatile 关键字,使一个变量在多个线程间可见。A B线程都用到一个变量,java默认是A线程中保留一份copy,这样如果B线程修改了该变量,则A线程未必知道。使用volatile关键字,会让所有线程都会读到变量的修改值。在下面的代码中,running是存在于堆内存的t对象中。当线程t1开始运行的时候,会把running值从内存中读...原创 2020-09-09 19:12:18 · 275 阅读 · 0 评论 -
synchronized关键字实战
文章目录前情提要在非static方法使用synchronized在static方法上使用synchronized可重入锁异常的锁同步方法和非同步方法是否可以同时访问锁升级前情提要java虚拟机规范没有规定synchronized的具体实现,所以此处以hotspot虚拟机实现的synchronized为例(markword)。在非static方法使用synchronized锁住当前对象...原创 2020-03-01 22:32:58 · 276 阅读 · 0 评论 -
线程和进程的概念
文章目录进程线程进程单进程:在同一个时间段上只允许一个程序在执行。多进程:在同一个时间段上可以运行多个程序,并且这些程序会进行资源的轮流抢占,所以在同一个时间段上会有多个程序同时执行,但是在同一个时间点上只会有一个进程执行(单核CPU时代)。到了多核CPU时代, 即便进程多了很多,也可以比单核CPU处理的速度有所提升。线程线程是在进程基础之上划分的更小的程序单元,线程是在进程基础上...原创 2020-03-01 19:39:59 · 125 阅读 · 0 评论