
Java并发
文章平均质量分 92
Java并发
fedorafrog
这个作者很懒,什么都没留下…
展开
-
ThreadLocal(三)TransmittableThreadLocal详解
1. 简介TransmittableThreadLocal 是Alibaba开源的、用于解决 “在使用线程池等会缓存线程的组件情况下传递ThreadLocal” 问题的 InheritableThreadLocal 扩展。若希望 TransmittableThreadLocal 在线程池与主线程间传递,需配合 TtlRunnable 和 TtlCallable 使用。2. 使用场景下面是几个典型场景例子。分布式跟踪系统 应用容器或上层框架跨应用代码给下层SDK传递信息 日志收集记录系统上转载 2021-06-27 20:46:25 · 906 阅读 · 0 评论 -
ThreadLocal(二)InheritableThreadLocal详解
1. 简介在上一篇 ThreadLocal详解 中,我们详细介绍了ThreadLocal原理及设计,从源码层面上分析了ThreadLocal。但由于ThreadLocal设计之初就是为了绑定当前线程,如果希望当前线程的ThreadLocal能够被子线程使用,实现方式就会相当困难(需要用户自己在代码中传递)。在此背景下,InheritableThreadLocal应运而生。Inheritable thread-local variables are used in preference to ord转载 2021-06-27 20:28:54 · 335 阅读 · 0 评论 -
Java并发(十一)ReentrantReadWriteLock分析
ReadWriteLock管理一组锁,一个是只读的锁,一个是写锁。读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的。所有读写锁的实现必须确保写操作对读操作的内存影响。换句话说,一个获得了读锁的线程必须能看到前一个释放的写锁所更新的内容。读写锁比互斥锁允许对于共享数据更大程度的并发。每次只能有一个写线程,但是同时可以有多个线程并发地读数据。ReadWriteLock适用于读多写少的并发情况。Java并发包中ReadWriteLock是一个接口,主要有两个方法,如下:public interf转载 2021-03-16 14:06:08 · 246 阅读 · 0 评论 -
内存屏障(Memory Barrier)与volatile
1. 写缓存(Store Buffer)写缓存是一个容量极小的高速存储部件,每个核都有自己的写缓存,而且一个核不能够读取到其他核的写缓存(Store Buffer)的内容。如上面的场景,核A修改共享的缓存,先将这个修改操作放入到写缓存(Store Buffer)中,再告诉其他核中的缓存失效了,然后核A继续执行其他指令操作,当接受到了其他核返回无效状态修改的消息之后,才将写缓存(Store Buffer)中的操作写入到核A中的缓存中,这时写操作才算完成。这样就解决了等待阻塞所带来的性能问题,减少了转载 2021-02-10 15:00:10 · 1103 阅读 · 1 评论 -
Java并发(十)CountDownLatch和CyclicBarrier
1. 前言并发编程的三大核心是分工,同步和互斥。在日常开发中,经常会碰到需要在主线程中开启多个子线程去并行的执行任务,并且主线程需要等待所有子线程执行完毕再进行汇总的场景,这就涉及到分工与同步的内容了在讲有序性可见性,Happens-before来搞定时,提到过 join() 规则,使用 join() 就可以简单的实现上述场景:@Slf4jpublic class JoinExample { public static void main(String[] args) thr..转载 2021-01-02 14:58:59 · 337 阅读 · 0 评论 -
Java并发(九)Semaphore
1. 前言AQS 中我们介绍了独占式获取同步状态的多种情形:独占式获取锁 可响应中断的独占式获取锁 有超时限制的独占式获取锁AQS 提供的模版方法里面还差共享式获取同步状态没有介绍,所以我们今天来揭开这个看似神秘的面纱。1.1 AQS中的共享式获取同步状态独占式是你中没我,我中没你的的一种互斥形式,共享式显然就不是这样了,所以他们的唯一区别就是:同一时刻能否有多个线程同时获取到同步状态简单来说,就是这样滴:我们知道同步状态 state 是维护在 AQS 中的,抛开可转载 2021-01-02 14:19:29 · 204 阅读 · 0 评论 -
Java线程状态详解
1.线程的6种状态Java线程Thread在package java.lang;中可以找到,通过源码,我们可以看到其状态有如下6种NEW RUNNABLE BLOCKED WAITING TIMED_WAITING TERMINATED1.1NEW顾名思义,这个状态,只存在于线程刚创建,未start之前,例如 MyThread thread = new MyThread(); System.out.println(thread.getState..转载 2020-12-23 16:34:14 · 210 阅读 · 1 评论 -
Java并发(八)CompletableFuture
1.前言上一篇文章全面分析了 Future,通过它我们可以获取线程的执行结果,它虽然解决了 Runnable 的 “三无” 短板,但是它自身还是有短板:不能手动完成计算假设你使用 Future 运行子线程调用远程 API 来获取某款产品的最新价格,服务器由于洪灾宕机了,此时如果你想手动结束计算,而是想返回上次缓存中的价格,这是 Future 做不到的调用 get() 方法会阻塞程序Future 不会通知你它的完成,它提供了一个get()方法,程序调用该方法会阻塞直到结果可用为止.转载 2020-07-31 17:19:21 · 598 阅读 · 0 评论 -
Java并发(七)Future介绍
1. 前言创建线程有几种方式?这个问题的答案应该是可以脱口而出的吧 继承 Thread 类 实现 Runnable 接口 但这两种方式创建的线程是属于”三无产品“: 没有参数 没有返回值 没办法抛出异常 classMyThreadimplementsRunnable{@Overridepublicvoidrun(){log.info("mythread");}}Runnable 接口是 JDK1...转载 2020-07-31 16:10:40 · 639 阅读 · 1 评论 -
Java线程池参数配置
在线程池的实际使用中,参数的配置总让人难以把握。在网上搜了一下,主要有以下的方案。跟大家分享。1. 基本概念1.1 ThreadPoolExecutor的重要参数corePoolSize:核心线程数核心线程会一直存活,及时没有任务需要执行 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理 设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭queueCapacity:任务队列容量(阻塞队列)当核心线程数达到最大时,转载 2020-05-13 16:40:38 · 1152 阅读 · 1 评论 -
ArrayBlockingQueue和LinkedBlockingQueue解析
1. BlockingQueue接口简介java.util.concurrent 包里的BlockingQueue是一个接口,继承Queue接口,Queue接口继承Collection。BlockingQueue 具有 4 组不同的方法用于插入、移除以及对队列中的元素进行检查。如果请求的操作不能得到立即执行的话,每个方法的表现也不同。这些方法如下: 抛出异常 特殊值...转载 2020-02-28 13:28:48 · 1604 阅读 · 0 评论 -
Java中的偏向锁,轻量级锁, 重量级锁解析
1. Java 中的锁在 Java 中主要2种加锁机制:synchronized关键字 java.util.concurrent.Lock(Lock是一个接口,ReentrantLock是该接口一个很常用的实现)2. 一些先修知识2.1Java 对象头字宽(Word): 内存大小的单位概念, 对于 32 位处理器 1 Word = 4 Bytes, 64 位处理器 1 ...转载 2020-02-25 09:23:16 · 1027 阅读 · 0 评论 -
ThreadLocal(一)原理及内存泄露预防
1. 前言ThreadLocal提供了线程独有的局部变量,可以在整个线程存活的过程中随时取用,极大地方便了一些逻辑的实现。常见的ThreadLocal用法有:存储单个线程上下文信息。比如存储id等; 使变量线程安全。变量既然成为了每个线程内部的局部变量,自然就不会存在并发问题了; 减少参数传递。比如做一个trace工具,能够输出工程从开始到结束的整个一次处理过程中所有的信息,从而方便d...转载 2020-02-17 11:27:06 · 390 阅读 · 0 评论 -
Java线程池
1. 线程池优点在实际使用中,线程是很占用系统资源的,如果对线程管理不善很容易导致系统问题。因此,在大多数并发框架中都会使用线程池来管理线程,使用线程池管理线程主要有如下好处:降低资源消耗。通过复用已存在的线程和降低线程关闭的次数来尽可能降低系统性能损耗; 提升系统响应速度。通过复用线程,省去创建线程的过程,因此整体上提升了系统的响应速度; 提高线程的可管理性。线程是稀缺资源,如果无限...转载 2020-02-13 14:35:54 · 220 阅读 · 0 评论 -
Java并发(六)ReentrantLock可重入锁深度分析
1. 概述ReentrantLock相当于是对synchronized的一个实现,他与synchronized一样是一个可重入锁并且是一个独占锁,但是synchronized是一个非公平锁,任何处于竞争队列的线程都有可能获取锁,而ReentrantLock既可以为公平锁,又可以为非公平锁。根据上面的源码我们可知,ReentrantLock实现了Lock接口,并且是并发编程大师Doug ...转载 2020-01-07 17:50:20 · 237 阅读 · 1 评论 -
Java并发(五)模版方法模式
1. 模版方法结构模板方法的本质其实就是类的继承,模板方法模式需要开发抽象类和具体子类的设计之间的协作,我们实际工作中应该有很多这样的场景,比如我们通常会在业务逻辑层定义好Service类的抽象方法,而实际的业务逻辑实现会交给ServiceImpl类。模板方法模式的类结构图大致如下:抽象模板(AbstractTemplate)角色有如下责任:定义了一个或多个抽象操作,以便让子类实现...转载 2020-01-07 17:25:15 · 197 阅读 · 0 评论 -
Java并发(四)AQS
1. AQS产生的背景通过JCP的JSR166规范,Jdk1.5开始引入了j.u.c包,这个包提供了一系列支持并发的组件。这些组件是一系列的同步器,这些同步器主要维护着以下几个功能:内部同步状态的管理(例如表示一个锁的状态是获取还是释放),同步状态的更新和检查操作,且至少有一个方法会导致调用线程在同步状态被获取时阻塞,以及在其他线程改变这个同步状态时解除线程的阻塞。上述的这些的实际例子包括:互...转载 2020-01-07 17:06:44 · 235 阅读 · 0 评论 -
Java并发(三)CAS
1. 并发编程三要素-原子性、可见性、有序性在讨论CAS前,我想先讨论一下并发编程的三要素,这个应该可以帮助理解CAS的作用等。其实上一篇提到的Java内存模型就是围绕着在并发过程中如何处理原子性、可见性和有序性这3个特征来建立的,所以我理解Java编程实现如果满足了这3个特性,就是线程安全的,可以支持并发访问。原子性:指的是一个操作不能再继续拆分,要么一次操作完成,要么就是不执行。在Ja...转载 2020-01-07 16:45:25 · 367 阅读 · 0 评论 -
Java并发(二)volatile
1. volatile的特性保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。(实现可见性) 禁止进行指令重排序。(实现有序性) volatile 只能保证对单次读/写的原子性。i++ 这种操作不能保证原子性。2. Java内存模型在Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)...转载 2020-01-07 16:37:34 · 124 阅读 · 0 评论 -
Java并发(一)synchronized
1. 定义synchronized可以将任意一个非NULL的对象当作锁。属于独占式的悲观锁,同时属于可重入锁。2. 作用范围作用于方法时,锁住的是对象的实例(this); 当作用于静态方法时,锁住的是Class实例,又因为Class的相关数据存储在永久带PermGen(jdk1.8则是metaspace),永久带是全局共享的,因此静态方法锁相当于类的一个全局锁,会锁所有调用该方法的线...转载 2020-01-07 16:16:42 · 175 阅读 · 0 评论