线程并发
文章平均质量分 79
多线程编程
石头城程序猿
架构师的成长之旅,寂寞,孤独,与码为伴!
展开
-
java1.8异步编程CompletableFuture,实现线程间通信
说到线程间的通信,大家会想到原创 2021-06-11 15:53:06 · 1845 阅读 · 1 评论 -
畅聊 java 异步编程
从自身的感受聊一下异步编程的思想,异步是一种生产者消费者、服务调用方与被调用方之间的解耦,服务发起方不用等待某个环节的结果(不会因为网上订个快餐,快餐送达之前啥事都不干了):场景一:数据的生产者的生产能力不应该严格依赖于消费者的消费速度,不会被消费者的响应异常而拖慢整体服务能力,常规的思路:1)单体架构中,可以采用池化技术,线程池是最好的选择,生产者可以将task推入线程池,当线程池处理速度跟不上,可以在硬件资源足够满足的情况,调整最大线程的数量;2)当硬件资源不足,CPU资源占用很高,可以采原创 2021-06-10 22:57:34 · 174 阅读 · 0 评论 -
synchronized锁升级流程(偏向锁、轻量级锁-锁自旋、重量级锁)
一、synchronized优化原创 2021-05-27 20:22:37 · 514 阅读 · 0 评论 -
探索线程安全性背后的可见性、伪共享、缓存一致性协议MESI
一、前言有没有很多同学在学习多线程并发环节的时候,针对synchronized,volatile关键的学习,感觉很枯燥,很多时候纯粹为了应付面试,当面试问底层原理的时候,依旧比较懵逼,立马可以识别出来初级成员和高级程序员;当然博主本人当时也这么困惑过,好在自己没有放弃,坚持学习,希望今天的分享,能够给大家打开一扇窗。二、计算机架构...原创 2021-05-24 18:09:15 · 334 阅读 · 0 评论 -
多线程并发-线程池-思维脑图
源码对照:/** * Creates a new {@code ThreadPoolExecutor} with the given initial * parameters. * * @param corePoolSize the number of threads to keep in the pool, even * if they are idle, unless {@code allowCoreThreadTimeOu...原创 2020-06-10 20:33:11 · 2381 阅读 · 2 评论 -
深入分析ConcurrentHashMap的源码设计(下)-元素个数底层设计原理、扩容
深入分析ConcurrentHashMap的源码设计(上)深入分析ConcurrentHashMap的源码设计(中)深入分析ConcurrentHashMap的源码设计(下)一、前言本章节,我们重点介绍两个知识点:1、当多线程并发执行节点添加时,ConcurrentHashMap是如何累加元素个数;2、扩容;二、添加元素个数: 1、第一阶段:初始化阶段: 1)直接去访问baseCount累加元素的个数 2)找到Counter...原创 2020-06-06 11:12:40 · 663 阅读 · 2 评论 -
深入分析ConcurrentHashMap的源码设计(中)-hash冲突
深入分析ConcurrentHashMap的源码设计(上) 深入分析ConcurrentHashMap的源码设计(中) 深入分析ConcurrentHashMap的源码设计(下)一、前言: 本章节,我们聊一下数据存储过程中,多个不同的 key 根据hash函数求出来的hash值相同的问题,即hash冲突,解决hash冲突有以下四种办法:线性探索(开放寻址法):例如求出来的索引位置是i,如果当前节点有值,则尝试索引位置+1,看看节点是否为空,为空则返回当前位置,例如存入Key=A,...原创 2020-06-04 23:59:33 · 1737 阅读 · 0 评论 -
深入分析ConcurrentHashMap的源码设计(上)-hash函数、hash表
一、前言 在分析ConcurrentHashMap之前,我们先来分析一下集合中提供的HashMap(线程不安全)、HashTable(线程安全),HashMap在动态扩容时,容易导致Entry的下一节点不为空,到时死循环(JDK1.8中,这个BUG已经修复,大伙想验证,记得把编译器改到1.7);HashTable虽然是线程安全的,但是以牺牲性能作为代价。 在jdk1.5之后的版本中,提供了java.util.concurrent工具包,分别针对多线程并发编程暴露的出来几个问题...原创 2020-06-03 16:29:10 · 290 阅读 · 0 评论 -
多线程并发编程-并发工具类-CyclicBarrier(同步屏障)
一、前言: CyclicBarrier从字面意思看可以循环使用的屏障,让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会打开,所有被屏障拦截的线程才会继续运行; 说了这么多,大家估计还是很晕乎,接下来,我们来个例子,根据例子运行结果,分析CyclicBarrier工作原理二、代码案例:...原创 2020-06-02 09:17:17 · 305 阅读 · 0 评论 -
多线程并发编程-并发工具类-Semaphore(信号量),流量控制
一、前言:二、案例分析:package com.jason.thread.tool.semaphore;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Semaphore;/** * @program: JasonSpringMybatis * @description * @author: 大龄程序猿.原创 2020-06-01 23:31:56 · 476 阅读 · 0 评论 -
多线程并发编程-并发工具类----CountDownLatch原理分析&适用场景分析&对比join差异
一、前言: 首先,在前面我们在学习线程间通信的时候,学到一个关键字:join,例如在main方法中,执行t1.join(),t2.join(),则main主线程会阻塞运行,直到t1,t2分别执行完,回调阻塞在t1,t2上面的线程。这是main线程会重新获得执行契机。 今天咱们学习的CountDownLatch,是非常有用的开发工具类,在JDK1.5版本中,开发包,提供了CountDownLatch也可以实现join的功能,并且比join支持的功能更多,它允许一个或多个线程等待其他...原创 2020-05-31 12:39:51 · 292 阅读 · 0 评论 -
多线程并发编程--AQS阻塞队列、Condition.await()/signal()源码分析、生产-消费者案例分享 -上
一、前言: 复习一下之前学习的知识点,之前咱们学习了synchronized、wait、notify相关功能,synchronized实现锁,有隐形的可重入功能(同一个线程,可以重复进入一把锁); wait/notify实现线程间的异步通信;wait会释放锁,进入等待队列(线程状态:WAITING) ,需要依赖别的线程notify唤醒;其中wait(long time) 超时等待(线程状态:TIMED_WAITING),时间到,自动转入就绪队列,竞争锁。二、今...原创 2020-05-30 16:03:23 · 478 阅读 · 0 评论 -
多线程并发-线程状态切换-后宫狗血剧情版,看完彻底掌握线程状态切换流程
原创 2020-05-27 18:01:36 · 315 阅读 · 0 评论 -
多线程并发编程-ThreadLocal详讲-通俗易懂
一、前言: 多线程并发编程,为了解决共享变量的可见性问题,可以使用volatile关键字,解决共享变量在线程之间的可见线性,A修改共享变量后,B读取的时候,会自动从主内存读取,同时更新CPU高速缓存。 如果线程需要在线程自身维护一个共享变量副本,减少多线程之间的干扰。可以使用ThreadLocal,我们看一下线程的UML模型,在Thread中维护了ThreadLocal.ThreadLocalMap成员变量,ThreadLocalMap是Entry(key,value)键值...原创 2020-05-26 13:21:48 · 236 阅读 · 0 评论 -
多线程并发编程-synchronized 与 ReentrantLock 区别,面试常问
一、前言: 在多线程并发编程中,基本都会遇到锁的概念,锁的几个基本特征:互斥性 可重入性、 jdk自带的关键字synchronized,实现了java最原始的重量级锁,根据锁的范围,有对象锁和类锁两个概念;在Jdk 1.5中,引入了java.util.concurrent包(后面统称:JUC),引入了Lock锁。二、具体对比: synchronized Lock...原创 2020-05-25 10:39:49 · 219 阅读 · 0 评论 -
多线程并发编程-死锁问题和对应的解决方案汇总-面试常考
一、首先死锁需要满足以下几个条件: 多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放,而该资源又被其他线程锁定,从而导致每一个线程都得等其它线程释放其锁定的资源,造成了所有线程都无法正常结束。这是从网上其他文档看到的死锁产生的四个必要条件:1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用 2、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。 3、请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。 4...原创 2020-05-24 00:33:51 · 488 阅读 · 0 评论 -
多线程编程-线程间通信-Join指令-使用场景与原理分析
一、首先,线程间通信的场景有几种: 1)A线程while()循环时,可以通过中断指令,B线程通知A线程退出,这样A线程即使在wait/sleep,都会收到中断通知,代码层面主动捕获异常,根据捕获的异常做对应逻辑处理。 2)A线程在执行wait指令时,当前线程会释放锁,进入等待队列。等待队列到就绪队列,需要其他线程调用notify或者notifyALL指令,这A线程可以就绪队列,重新竞争锁。 3)A线程如果会优于B线程执行完成,如果我们需要A线程等待B线程执行完成,再继续往下...原创 2020-05-25 13:15:39 · 443 阅读 · 0 评论 -
多线程并发编程-线程安全问题-数据原子性问题&解决方案
一、首先通过下面一个例子来看一下,数据一致性问题:package org.jason.thread;import static java.lang.Thread.sleep;/** * 2020/5/22 * author jason */public class ThreadSyn { public static int count=0; public static void main(String[] args) { Thread t1= new原创 2020-05-22 13:04:16 · 408 阅读 · 0 评论 -
多线程编程-线程的状态&状态切换
一、Java概念中,线程的状态有哪些: java 的线程有以下6中:new状态、终止状态、WAITING状态、TIMEDWAITING、就绪、运行、终止。 操作系统层面,线程只有5中,去掉NEW&终止状态。...原创 2020-05-21 23:34:57 · 331 阅读 · 0 评论 -
多线程并发编程入门之线程的并行与并发
一、首先,理解并行与并发的含义: 现在很多机器都是多核,例如当前是4核,那么并行的数量就是4;并发是指我们服务器应用单位时间内,同时处理请求的能力。 从多线程的特点来看: 1)同步: 缺点:发短信流程如果异常,则会影响生单的流程,类似一个数据事务;仔细研究发现,发送短信并非生单流程中的关键路径,可以采用异步的方式,缩短关键业务的关键路径;针对非关键路径的流程采用异步执行的方式,例如工单表、插入MQ队列、单独起异步线程等等方式执行,如果处理失败...原创 2020-05-21 22:01:22 · 426 阅读 · 0 评论 -
多线程编程-Executors线程池 详解
一、前言:Java通过Executors提供四种线程池,分别为:1、newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程,有隐患。2、newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。3、newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行:ScheduledExecutorService pool2=Executor原创 2020-05-20 00:19:30 · 679 阅读 · 0 评论 -
多线程编程-java线程创建的几种方式,初学者福利-面试常问
一、前言: java中,线程的创建大概有以下几种方式: 1)继承Thread,重写void run()方法; 2)实现Runnable接口,重写void run()方法; 3)实现Callable接口,重写call方法;FutureTask包装Callable接口。二、重点写一下Callable接口: 自定义类实现Callable接口,重写call方法; 用心创建的Callable 对象,重建FutureTask,同时...原创 2020-05-19 23:45:42 · 275 阅读 · 0 评论 -
多线程编程-线程间通信-wait¬ify
一、数据模型: 知识储备:类锁,对象锁,不清楚的,可以学习一下二、以生产者、消费者为例,实现线程间的通信:package com.jason.thread.product;import java.util.Deque;import static java.lang.Thread.sleep;/** * @program: JasonSpringBoot * @description * @author: 大龄程序猿 * @create: 2020-05...原创 2020-05-18 00:20:51 · 225 阅读 · 0 评论