Java并发编程
文章平均质量分 83
Java并发编程
TizzyGoodhealth
反派角色
展开
-
深入理解CyclicBarrie
深入理解CyclicBarrier原创 2022-11-05 20:29:39 · 687 阅读 · 0 评论 -
深入理解CountDownLatch计数器
CountDownLatch实现原理原创 2022-11-03 09:00:00 · 605 阅读 · 0 评论 -
深入理解AQS
AQS原创 2022-11-01 09:30:00 · 515 阅读 · 0 评论 -
并发编程之深入理解CAS与Atomic原子操作类
Java并发之CAS原创 2022-10-26 09:30:00 · 486 阅读 · 2 评论 -
深入理解并发三大特性
JMM 与 CPU 缓存一致性原创 2022-10-21 09:00:00 · 527 阅读 · 0 评论 -
关于局部变量的线程池,会不会被回收
关于局部变量的线程池,会不会被回收遇到个问题,模拟一下,得出结论。线上监控线程数量一直增加,经过查询是同事在使用线程池没有关闭伪代码如下 static void test(){ //方法内 定义线程池 ExecutorService pool = new org.apache.tomcat.util.threads.ThreadPoolExecutor(1, 2, 10, TimeUnit.SECONDS, new Synchronou原创 2022-05-23 22:19:19 · 1508 阅读 · 0 评论 -
Future 用法详解
Future 用法详解前言为什么出现Future机制常见的两种创建线程的方式。一种是直接继承Thread,另外一种就是实现Runnable接口。这两种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。Future模式的核心思想是能够让主线程将原来需要同步等待的这段时间用来做其他的事情。因为可以异步获得执行结果,所以不用一直同步等待去获得执行结果。Future 用法详解用法很原创 2022-04-21 23:03:21 · 2371 阅读 · 0 评论 -
线程池原理
线程池原理线程池的实现原理线程池的实现原理其实可以看成一个生产者消费者模型。我们执行线程往线程池里提交任务,线程池里的线程去消费任务,其他的一些策略去保证线程池和系统安全,如拒绝策略,线程大小的控制,阻塞队列的大小。JDK中线程继承图如下可以看比较详细的具体的继承图顶级接口只有一个执行任务的方法public interface Executor { void execute(Runnable command);}ExecutorService 接口额外添加了一些 关原创 2022-04-17 23:37:06 · 319 阅读 · 2 评论 -
ExecutorCompletionService使用详解
ExecutorCompletionService使用详解前言ExecutorCompletionService 为什么需要使用这个类?jdk8提供的 CompletionService 接口,实现类 ExecutorCompletionService。我们先来看一个例子?很明显下面任务批量提交线程池,等待线程池运行,每个任务执行时间不同。 //此线程池线程递增 ExecutorService executorService = Executors.newCache原创 2022-04-16 16:45:14 · 4468 阅读 · 4 评论 -
CompletableFuture用法详解
CompletableFuture用法详解前言JDK汇总已经提供了异步编程的类Future<T>,为什么还要CompletableFuture这个类呢?我们通常在使用Future接口异步编程时,获取结果都需要阻塞获取。主线程中会阻塞,其实最好的结果是让它执行完结果后通知我们获取。还有一种情况,当我们需要多个异步结果嵌套时候,Future这个接口就就不能满足我们的实用场景了,可能需要我们手动在里面进行嵌套。对此,从JDK 8开始,在Concurrent包中提供了一个强大的异步编程工具 C原创 2022-04-05 19:20:34 · 2448 阅读 · 0 评论 -
线程池用法详解
线程池用法详解前言为什么需要用到线程池?众所周知线程是操作系统一种宝贵的资源,创建和销毁都很耗费资源,对此,java中针对这种情况实现出线程池思想,维护一定数量的线程,用到时候就不需要去创建,不使用时候,就销毁一定量的,保留一部分线程数量。Java线程池的工作流程Java线程池的工作流程为:线程池刚被创建时,只是向系统申请一个用于执行线程队列和管理线程池的线程资源。在调用execute()添加一个任务时,线程池会按照以下流程执行任务。如果正在运行的线程数量少于corePoolSize(用户定原创 2022-04-04 19:22:11 · 1320 阅读 · 6 评论 -
深入理解 ReentrantLock
ReentrantLock用法详解前言我们都知道JDK中已经有了synchronized 锁,为什么还要提供 ReentrantLock锁与 相比 ReentrantLock锁有什么优势?为什么需要提供这个锁?ReentrantLock 锁 和 synchronized 锁 该怎么选择?synchronized 锁隐式锁可冲入锁自动释放锁不能人为控制synchronized 锁 ,自动释放锁,好处是不需要我们担心释放锁,但也带来一个问题,如果下面代码锁总执行时间很长,也就意味着长时间原创 2022-04-04 16:27:59 · 4019 阅读 · 2 评论 -
StampedLock用法详解
文章目录StampedLock用法详解前言原因StampedLock锁使用场景StampedLock用法详解前言为什么需要用这个锁?已经有了读写锁 ReentrantReadWriteLock ,为什么还需要这个锁?原因读写锁存在一个问题:当读锁比例很多,写锁很少,锁竞争情况下,写锁抢到锁的机会就回少,读锁数量太大的情况下,写锁不一定能抢到锁。StampedLock锁使用场景当读写锁比例相差很大时候,为了均衡读和写不出现锁饥饿现象,特此JDK中引入了一个新的锁,用来防止读写时候出现锁饥饿。原创 2022-04-03 23:28:50 · 851 阅读 · 2 评论 -
深入理解读写锁ReentrantReadWriteLock
读写锁ReentrantReadWriteLock用法详解原创 2022-04-03 23:08:11 · 3810 阅读 · 0 评论 -
线程池处理任务,异常处理
文章目录线程池处理任务,异常处理前言异常处理线程池处理任务,异常处理前言业务开发中我们使用线程池或者线程处理任务,异常如何处理,线程并不像平时try…catch那样捕获。异常处理Thread中,提供了一个返回线程异常的一个方法 Thread r = new Thread(run); r.setUncaughtExceptionHandler((t, e) -> { System.out.println(原创 2022-04-03 20:49:56 · 925 阅读 · 0 评论 -
深入理解信号量Semaphore
Semaphore用法详解原创 2022-03-28 22:57:41 · 3363 阅读 · 1 评论 -
Exchanger用法详解
Exchanger用法详解Exchanger适用场景Exchanger用于线程之间交换数据,其使用代码很简单,主要是使用是一个exchange()方法。一个简单的例子如下 Exchanger<String> exchanger = new Exchanger<>(); new Thread(()->{ System.out.println(" thread 1 "); try {原创 2022-03-28 22:22:42 · 522 阅读 · 1 评论 -
Phaser用法详解
Phaser用法详解用Phaser替代CyclicBarrier和CountDownLatchPhaser相比CyclicBarrier和CountDownLatch功能更强大,包括它两的所有功能。用Phaser替代CyclicBarrierpublic class PhaserTest1 { public static void main(String[] args) { Phaser phaser = new Phaser(); for (in原创 2022-03-27 23:07:34 · 889 阅读 · 1 评论 -
CyclicBarrier 用法详解
CyclicBarrier 用法详解CyclicBarrier使用场景用于协调多个线程同步执行操作的场合,所有线程等待完成,然后一起做事情( 相互之间都准备好,然后一起做事情 )例如百米赛跑,必须等待所有运动员都准备好了,才能比赛。运动员准备好,裁判也准备好,才能开始正式比赛。 CyclicBarrier cyclicBarrier = new CyclicBarrier(3); new Thread(() -> { try {原创 2022-03-27 22:16:00 · 8540 阅读 · 0 评论 -
CountDownLatch用法详解
CountDownLatch用法详解CountDownLatch使用场景线程计数器 用于线程执行任务,计数 等待线程结束用法一: 等待所有的事情都做完 //程序计数器 CountDownLatch countDownLatch = new CountDownLatch(2); //2个线程 ExecutorService executorService = Executors.newFixedThreadPool(2);原创 2022-03-27 21:45:44 · 33851 阅读 · 5 评论 -
自定义一个显示锁,并且这个锁存在超时机制
synchronized 锁存在几个问题我们在使用synchronized锁时候,由于synchronized(锁升级和锁竞争本文不讨论)特定锁机制,导致我们不能针对锁进行控制如果到获取到锁,但迟迟没释放锁,或者说执行时间过长,但是没有出现异常,就不会释放锁。static final Object lock = new Object(); synchronized (lock){ while (true){ //原创 2022-03-27 14:59:26 · 940 阅读 · 0 评论 -
线程的优雅关闭
线程的优雅关闭前言我们都知道线程是一段运行中的diamante,既然在运行中,我们怎么讲它停下来。能否强制让它停下来?强制停下来,是否会存在问题?有什么好的办法,可以优雅的让其停下来?如何优雅的关闭一个线程在JAVA中,一个线程一旦运行起来,就不要去强行打断它,合理的关闭是让它运行完,然后干净的释放资源,最后退出。如果一旦强制打断,那么线程中使用的资源如io等资源不会被正确释放,这么做是存在一定问题的。关于线程退出的几种方式首先JDK中给我们提供了销毁和停止线程的方法可以看到stop以及原创 2022-03-20 16:43:09 · 913 阅读 · 3 评论 -
多线程生产者消费者
生产者和消费者关于生产者消费设计模式一个负责生产 一个负责消费可以启动多个进行生产,也可以启动多个消费,最主要的是做好边界控制以及数据同步,写读互斥。简单的有锁实现,有锁当然会影响性能,当然写不是很频繁的话,也可以使用这种去实现这里使用thread 原生方法去实现生产者以及消费者,当然也可以使用Lock锁的condition信号和通知去实现package thread.thread;import java.util.LinkedList;import java.util.concurren原创 2022-03-20 16:12:29 · 415 阅读 · 0 评论 -
多线程下载文件提升性能
多线程下载文件前言最近项目中导出和下载文件因为数据量太大,导致下载时间过长,甚至出现下载不下来文件(超时,超出nginx的最大时间)故此使用多线程优化一下思考不管是多线程还是单线程,对于下载和导出文件,然后再下载到浏览器,核心就是根据文件类型,将字节写入到浏览器。了解知识浏览器识别文件的类型已经生成好字节数组和需要读取文件下载读取文件的时候,需要随机读(指定跳过多少字节),这里我们使用RandomAccessFile这个类,具体可以百度了解一下。浏览器识别字节的顺序这里需要注意原创 2022-02-12 16:53:09 · 944 阅读 · 0 评论 -
Java多线程之线程池 Executors 使用
Java多线程之线程池使用前言学习使用线程池,而不是每次用线程的时候手动去创建,然后再进行销毁,浪费系统资源。对此线程池应运而生,将一些线程进行复用,循环使用,等下一次业务请求时候,提前创建好的线程对其做一些处理。线程池简介为了避免系统频繁的创建和销毁线程,我们可以将创建的线程进行复用,提前创建好一定数量的线程,对外直接提供使用,而不是等到想用的时候手动去创建线程,使用完成之后,再去销毁...原创 2020-04-28 22:39:13 · 1436 阅读 · 0 评论 -
Java 多线程之CountDownLatch 计数器
文章目录CountDownLatch 计数器官方解释CountDownLatch 方法使用场景死锁检测CountDownLatch 计数器CountDownLatch 是一个非常实用的多线程控制工具类,称之为“倒计时器”它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。 1 每一个线程执行完毕之后,都需要执行countDownLatch.countDown()方法,不然计数...原创 2020-04-28 15:42:00 · 617 阅读 · 0 评论 -
并发线程的三个重要概念
并发线程的三个重要概念1 原子性对基本数据类型的变量读取和赋值是保证了原子性的,要么都成功,要么都失败,这些操作不可中断。比如 i = 10a = 10 原子性b=a 不满足 read a , 赋值 bc++ 不满足 read c ; add , 赋值 cc=c+1 不满足 read c;add; 赋值 c2 可见性 可以使用volatile 关键字保证可见性 什么是可...原创 2020-03-03 22:00:30 · 211 阅读 · 0 评论 -
多线程的 waitset
多线程的waitset介绍waitset 在线程wait()方法执行后,会被放入被锁对象的一个waitset里面去,而当前wait()的位置也会被记录。 private final static Object object = new Object(); IntStream.rangeClosed(1, 10).forEach(s -> { n...原创 2020-01-14 22:11:04 · 1104 阅读 · 0 评论 -
多线程之运行线程异常捕获
多线程之运行线程异常捕获/** * @description: 线程异常捕捉 * @author: Administrator * @create: 2019-12-23 22:22 **/public class ThreadException { public static void main(String[] args) { //线程抛出异常 ...原创 2019-12-23 22:34:29 · 398 阅读 · 0 评论 -
多线程之wait()和sleep()之间的区别
wait()和sleep()之间的区别1 从对象方法上来说wait()是Object的方法sleep()是Thread的方法2 从释放锁上来sleep 不释放锁,不需要唤醒wait 释放锁,需要唤醒 wait(long time) 除外3 从是synchronized关键字修饰来看sleep 一般不和 synchronized 使用wait 一般和 synchronized 一...原创 2019-12-20 21:14:48 · 164 阅读 · 1 评论 -
多线程之线程间通信 ,生产者和消费者,等待和唤醒机制
文章目录多线程之线程间通信1 生产者和消费者2 单线程下的线程通信线程等待线程唤醒3 多线程下生产者消费者多线程之线程间通信学习线程通信之前我们需要简单的了解下生产者和消费者模式。然后我们通过生产者和消费者 学习到线程间通信 等待与唤醒机制。1 生产者和消费者先来看生产者和消费者生产者 就是生产东西 如生产商品消费者 就是消费东西 如 卖商品用代码来描述就是: ...原创 2019-12-18 23:25:58 · 340 阅读 · 0 评论 -
java 类锁和对象锁
java 静态锁和对象锁对象锁java中要实现线程同步,同一个类中使用 synchronized 关键字在方法上或者代码块中默认表示使用当前对象的锁多线程访问时候会进行抢锁,释放锁,通对象的方法执行分先后顺序以下方法 lock1 lock2 lock3 表示相同的对象锁 lock4 表示的是 成员变量 object 的锁输出的时候 lock1 lock2 lock3 之中一个和 l......原创 2019-12-16 23:05:08 · 1809 阅读 · 1 评论 -
死锁
死锁 :死锁 互相持有对方的锁,互相等待对方释放锁,然后一直等下去,这个就是死锁。比如:两个线程 s1 s2互相获取o1,o2锁 让其睡眠 4s 然后在互相获取对方的锁,这时候 o1,o2已经被s1,s2所占用,此时处于等待所释放,然后就一直等下去。产生死锁public class DeadLock { private static Object o1 = new Object...原创 2019-12-16 22:14:07 · 119 阅读 · 0 评论 -
Java 创建线程读这一篇就够了
文章目录java 多线程线程创建两种方式创建线程模拟排队机叫号排队线程生命周期线程中一些常用方法构造方法Runable 参数传值nullThreadGroup 值,默认传值为null获取运行线程数量参数 stackSizejava 多线程线程创建两种方式集成Thread 类实现Runable接口两种方式都需要重写run方法启动线程调用start()方法创建线程这里继承Threa...原创 2019-12-08 17:31:24 · 384 阅读 · 1 评论