
并发&JUC
文章平均质量分 80
线程,锁,并发
cj_eryue
工作之余的学习
展开
-
CompeletableFuture常用方法的使用介绍
CompletableFuture是 Java 8 引入用于支持异步编程和非阻塞操作的类。主要新增的功能有:runAsync(): 异步执行,无返回值supplyAsync(): 异步执行,有返回值thenAccept(): 当task正常完成后,回调调用exceptionally(): 当task出现异常是,回调调用anyOf(): 当所有的task中,只要有一个task完成,则主线程继续往下走,可以使用.anyOf()方法allOf(): 所有的task均完成后,则主线程原创 2024-10-31 16:36:21 · 741 阅读 · 0 评论 -
二探ReentrantLock非公平锁的加解锁过程
ReentrantLock reentrantLock = new ReentrantLock(); reentrantLock.lock(); //... reentrantLock.unlock();①java.util.concurrent.locks.ReentrantLock#lockpublic void lock() { //具体的sync有公平和非公平(默认)两种 sync.lock();}②java.util.原创 2022-05-30 17:34:33 · 294 阅读 · 0 评论 -
InheritableThreadLocal原理解析
package com.cjian.threadlocal;import java.util.Collections;import java.util.HashMap;import java.util.Locale;import java.util.Map;/** * @description: * @author: CJ * @time: 2021/5/13 14:00 */public class ThreadLocalUtils { private static f.原创 2021-06-01 11:32:28 · 334 阅读 · 0 评论 -
浅谈死锁问题以及如何解决
一、死锁的产生我们在解决多线程共享资源的线程同步问题时,会使用synchronized关键字修饰方法或者通过Lock加锁方式修饰方法、代码块,防止多个线程访问统一资源产生的线程安全问题。但是当线程A持有锁a,等待锁b,而线程B此时持有锁b,等待锁a时,就会出现A,B两个线程互相等待的情况,这种情况就是死锁。二、模拟死锁package com.cjian.JUC;/** * @description: * @author: CJ * @time: 2021/5/8 9:21 */p原创 2021-05-08 09:34:53 · 681 阅读 · 3 评论 -
浅析ArrayBlockingQueue 和 LinkedBlockingQueue的阻塞原理
public void execute(Runnablecommand){if(command==null)throw new NullPointerException();intc=ctl.get();//如果活动线程数小于核心数,创建线程执行任务if(workerCountOf(c)<corePoolSize){if(addWorker(command,true))//true /false用来判断是创建核心线程还是最大线程return;c=ctl.get();...原创 2021-03-31 14:05:10 · 416 阅读 · 0 评论 -
线程池原理分析——线程是如何做到复用的
通过上篇文章的学习,我们初步认识了jdk提供的几种线程池的使用,接下来,我们来深入研究下:开始之前,我们再来回顾下线程池的参数,方便后面理解线程池的运行原理。核心线程(corePool):有新任务提交时,首先检查核心线程数,如果核心线程都在工作,而且数量也已经达到最大核心线程数,则不会继续新建核心线程,而会将任务放入等待队列。非核心线程/最大线程数(maximumPoolSize):当等待队列满了,如果当前线程数没有超过最大线程数,则会新建线程执行任务,那么核心线程和非核心线程到底有什么区别呢原创 2021-03-29 20:21:46 · 574 阅读 · 0 评论 -
5种线程池的简单介绍以及为什么要使用自定义线程池
我们知道创建线程对象,就会在内存中开辟空间,而线程中的任务执行完毕之后,就会销毁。单个线程的话还好,如果线程的并发数量上来之后,就会频繁的创建和销毁对象。这样,势必会消耗大量的系统资源,进而影响执行效率。所以,线程池就应运而生。生产环境使用的场景:有个功能,运算数据量大(最大可一起运算5w条数据,由于业务原因,每条数据需要与数据库交互好几次,还涉及不同的库),属于后台管理类的功能,我们最理想的方式就是使用异步处理的方式,即请求发送到后台后,开启一个线程去处理,不用立即给前端相应处理结果,提..原创 2021-03-25 15:41:02 · 3154 阅读 · 3 评论 -
ThreadLocal的原理分析以及ThreadLocalMap的源码分析
比如下面的demo,我们开启五个线程,分别去设置每个线程自己的content,再getpackage com.cjian.threadlocal;/** * 需求:线程隔离 * 在多线程并发的场景下,每个线程中的变量都是相互独立的 * @description: * @author: CJ * @time: 2020/11/13 16:34 */public class ThreadLocalDemo { private String content; publ.原创 2021-01-22 15:34:27 · 1479 阅读 · 0 评论 -
Thread——interrupt、interrupted、isInterrupted三个方法的区别
在学习AQS时,发现其内部有许多地方调用了interrupted()方法,这到底是个啥呢?我们来看一下其实这是Thread里面的方法:共有如下三个方法:interrupt:中断此线程(指调用该方法的Thread实例所代表的线程),实际上只是给线程设置一个中断标志,线程仍会继续运行interrupted:测试当前线程是否被中断(检查中断标志),返回一个boolean并清除中断状态,第二次再调用时中断状态已经被清除,将返回一个falseisInterrupted:只测试此线程是否被.原创 2021-01-05 10:32:47 · 534 阅读 · 5 评论 -
JUC——通过ReentrantLock的加锁过程说AQS
之前写了JUC——volatile关键字的使用以及底层原理浅析和JUC——CAS技术以及底层原理,也是为了后面说JUC里面的知识做铺垫的,本文我们再来说下AQS通过Reetrantlock的构造函数可知,默认为非公平锁 public ReentrantLock() { sync = new NonfairSync(); } public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new N原创 2020-12-29 17:01:27 · 271 阅读 · 0 评论 -
JUC——CAS技术以及底层原理
CAS(Compare-and-Swap),即比较并替换,是一种实现并发算法时常用到的技术,Java并发包中的很多类都使用了CAS技术。CAS也是现在面试经常问的问题,本文将深入的介绍CAS的原理。再介绍CAS之前,我们先来看一个例子:package com.cjian.JUC;import java.util.concurrent.CountDownLatch;/** * @description: * @author: CJ * @time: 2020/12/7 18:29.原创 2020-12-25 13:57:20 · 661 阅读 · 1 评论 -
Synchnorized底层原理与锁升级过程详解
通过之前的线程八锁我们得到synchronized关键字最主要有以下3种应用方式:修饰非静态方法(或者叫实例方法),作用于当前实例加锁,进入同步代码前要获得当前实例的锁; 修饰静态方法,作用于当前类加锁,进入同步代码前要或得当前类对象的锁; 修饰代码块,指定加锁对象,进入同步代码库前要获得给定对象的锁。三种都是基于进入和退出管程(Monitor)对象实现:修饰方法时:由方法调用指令读取运行时常量池中方法的 ACC_SYNCHRONIZED 标志来隐式实现(隐式同步):方法级的同步是隐式原创 2020-09-30 16:48:25 · 923 阅读 · 0 评论 -
CountDownLatch 小记
CountDownLatch是JDK提供的一个同步工具,它可以让一个或多个线程等待,一直等到其他线程中执行完成一组操作。CountDownLatch 的内部结构很简单,主要有countdown()和await()两个方法,CountDownLatch在初始化时,需要指定用给定一个整数作为计数器。当调用countDown方法时,计数器会被减1;当调用await方法时,如果计数器大于0时,线程会被阻塞,一直到计数器被countDown方法减到0时,线程才会继续执行。计数器是无法重置的,当计数器...原创 2020-09-14 16:46:08 · 518 阅读 · 0 评论 -
线程八锁(非静态同步方法与静态同步方法的区别)
所为线程八锁是指在工作中锁的几种情况,网上搜了好多,发现列举的八个代码实例,有不少代码实例都可有可无的,但是呢,为了完整地记录下这次的学习,那我写也写全吧,手动苦笑~~,请看列子1.同一个对象,开启两个线程,分别调用两个非静态同步方法package com.cjian.thread8lock;/** * Created by cjian on 2020/8/20. * 两个线程调同一个对象的两个同步方法 * * 原因分析:锁的对象是方法的调用者,即t8l,所以两个方法用的是同一个锁.原创 2020-08-20 10:53:42 · 421 阅读 · 0 评论