
多线程
文章平均质量分 72
liuhehe321
积跬步,足以至千里!
实践出真知!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
线程池的RejectedExecutionHandler(拒绝策略)
AVA为多线程场景提供了线程池,下面是一个线程池的构造方法:public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, Bloc...转载 2021-04-21 10:55:52 · 1789 阅读 · 0 评论 -
并发编程之submit和execute区别(七)
https://www.jianshu.com/p/29610984f1dd转载 2021-04-20 15:24:14 · 111 阅读 · 0 评论 -
线程池的状态切换
import java.util.concurrent.Callable;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;impor.原创 2021-04-20 12:24:15 · 609 阅读 · 0 评论 -
SynchronousQueue使用实例
序本文主要讲一下SynchronousQueue。定义SynchronousQueue,实际上它不是一个真正的队列,因为它不会为队列中元素维护存储空间。与其他队列不同的是,它维护一组线程,这些线程在等待着把元素加入或移出队列。如果以洗盘子的比喻为例,那么这就相当于没有盘架,而是将洗好的盘子直接放入下一个空闲的烘干机中。这种实现队列的方式看似很奇怪,但由于可以直接交付工作,从而降低了将数据从生产者移动到消费者的延迟。(在传统的队列中,在一个工作单元可以交付之前,必须通过串行方式首先完成入列[E转载 2021-04-20 10:29:24 · 399 阅读 · 0 评论 -
ThreadLocal全面解析
ThreadLocal全面解析前置知识 具有一定的javase和javaweb基础 熟悉synchronized关键字 熟悉HashMap 熟悉 JDBC技术 学习目标 了解ThreadLocal的介绍 掌握ThreadLocal的运用场景 了解ThreadLocal的内部结构 了解ThreadLocal的核心方法源码 了解ThreadLocalMap的源码 1. ThreadLocal介绍1.1 官方介.原创 2021-03-03 23:49:36 · 181 阅读 · 2 评论 -
8. 共享模型之工具-J.U.C工具包-读写锁、Semaphore、CountdownLatch和CyclicBarrier原理
读写锁原理1. 图解流程读写锁用的是同一个 Sycn 同步器,因此等待队列、state 等也是同一个t1 w.lock,t2 r.lock1) t1 成功上锁,流程与 ReentrantLock 加锁相比没有特殊之处,不同是写锁状态占了 state 的低 16 位,而读锁使用的是 state 的高 16 位2)t2 执行 r.lock,这时进入读锁的 sync.acquireShared(1) 流程,首先会进入 tryAcquireShared 流程。如果有写锁占据,那么 tryAc原创 2020-11-18 22:26:05 · 324 阅读 · 0 评论 -
8. 共享模型之工具-J.U.C工具包-ReentrantLock 原理
AQS 原理1. 概述全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架特点:用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁getState - 获取 state 状态 setState - 设置 state 状态 compareAndSetState - cas 机制设置 state 状态 独占模式是只有一个线程能够访问资源,而共享模式可以允许多个线程访问资源提供了基于 F原创 2020-11-18 22:05:06 · 451 阅读 · 0 评论 -
7. 共享模型之不可变
7. 共享模型之不可变本章内容不可变类的使用不可变类设计无状态类设计7.1 日期转换的问题问题提出下面的代码在运行时,由于 SimpleDateFormat 不是线程安全的SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");for (int i = 0; i < 10; i++) {new Thread(() -> {try {log.debug("{}", sdf.parse("1951-04-原创 2020-11-11 22:42:41 · 237 阅读 · 3 评论 -
4. 共享模型之管程
本章内容共享问题 synchronized 线程安全分析 Monitor wait/notify 线程状态转换 活跃性 Lock 原理之 wait / notifyOwner 线程发现条件不满足,调用 wait 方法,即可进入 WaitSet 变为 WAITING 状态 BLOCKED 和 WAITING 的线程都处于阻塞状态,不占用 CPU 时间片 BLOCKED 线程会在 Owner 线程释放锁时唤醒 WAITING 线程会在 Owner 线程调用 notify 或 n.原创 2020-11-11 21:12:34 · 216 阅读 · 0 评论 -
8. 共享模型之工具-线程池
8.1 线程池2. ThreadPoolExecutor1) 线程池状态ThreadPoolExecutor 使用 int 的高 3 位来表示线程池状态,低 29 位表示线程数量从数字上比较,TERMINATED > TIDYING > STOP > SHUTDOWN > RUNNING这些信息存储在一个原子变量 ctl 中,目的是将线程池状态与线程个数合二为一,这样就可以用一次 cas 原子操作进行赋值// c 为旧值, ctlOf 返回结果为新值ctl.原创 2020-11-11 19:43:48 · 222 阅读 · 0 评论 -
6. 共享模型之无锁
本章内容CAS 与 volatile 原子整数 原子引用 原子累加器 Unsafe 6.2 CAS 与 volatile前面看到的 AtomicInteger 的解决方法,内部并没有用锁来保护共享变量的线程安全。那么它是如何实现的呢?public void withdraw(Integer amount) {while(true) {// 需要不断尝试,直到成功为止while (true) {// 比如拿到了旧值 1000int prev = balance.get(..原创 2020-11-08 15:46:37 · 245 阅读 · 0 评论 -
5. 共享模型之内存
AAA原创 2020-11-06 00:00:03 · 155 阅读 · 0 评论 -
synchronized原理分析及轻量级锁、锁膨胀、自旋优化、偏向锁、锁消除
synchronizedJava HotSpot 虚拟机中,每个对象都有对象头(包括 class 指针和 Mark Word)。Mark Word 平时存储这个对象的 哈希码、分代年龄,当加锁时,这些信息就根据情况被替换为 标记位、线程锁记录指针、重量级锁指针、线程ID 等内容Java 对象头以 32 位虚拟机为例普通对象数组对象其中 Mark Word 结构为64 位虚拟机 Mark WordMonitor 原理Monitor 被翻译为监视器或管程每个 Jav原创 2020-11-04 23:57:42 · 288 阅读 · 0 评论 -
HashMap和ConcurrentHashMap原理分析
sss原创 2020-11-04 17:08:56 · 155 阅读 · 0 评论 -
CAS和volite结合使用,实现无锁编程
CAS 即 Compare and Swap ,它体现的一种乐观锁的思想,比如多个线程要对一个共享的整型变量执行 +1 操作:// 需要不断尝试while(true) {int 旧值 = 共享变量 ; // 比如拿到了当前值 0int 结果 = 旧值 + 1; // 在旧值 0 的基础上增加 1 ,正确结果是 1/*这时候如果别的线程把共享变量改成了 5,本线程的正确结果 1 就作废了,这时候compareAndSwap 返回 false,重新尝试,直到:compareAndSwap原创 2020-11-02 16:38:04 · 527 阅读 · 3 评论 -
线程优先级
假如我们的计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到 CPU时间片,也就是使用权,才可以执行指令。那么Java是如何对线程进行调用的呢?l线程有两种调度模型:•分时调度模型 所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片•抢占式调度模型 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,...原创 2019-03-10 22:45:42 · 377 阅读 · 0 评论 -
线程控制
我们已经知道了线程的调度,接下来我们就可以使用如下方法对象线程进行控制线程休眠public static void sleep(long millis)线程加入public final void join()线程礼让public static void yield()后台线程public final void setDaemon(boolean on)中断线程publi...原创 2019-03-10 22:59:47 · 162 阅读 · 0 评论 -
分布式架构操作数据库 使用redis锁解决并发操作问题
redis setnx getsethttp://www.redis.cn/commands/getset.html大家都知道,数据库并行操作setnx 使用将key设置值为value,如果key不存在,这种情况下等同SET命令。 当key存在时,什么也不做。SETNX是”SETifNot eXists”的简写。返回值Integer reply, 特定值:1如果k...转载 2019-04-25 08:21:17 · 329 阅读 · 0 评论 -
多线程初步
多线程概述多线程实现方案线程调度和线程控制线程生命周期线程同步死锁线程间通信定时器的使用Java程序运行原理•java 命令会启动 java 虚拟机,启动 JVM,等于启动了一个应用程序,也就是启动了一个进程。该进程会自动启动一个 “主线程” ,然后主线程去调用某个类的 main 方法。所以 main方法运行在主线程中。在此之前的所有程序都是单线程的...原创 2019-03-10 22:40:02 · 151 阅读 · 0 评论