Java并发-原理解析
文章平均质量分 90
Java并发-原理
OkidoGreen
这个作者很懒,什么都没留下…
展开
-
多线程调用如何传递请求上下文?简述ThreadLocal和TaskDecorator
先看官方api文档说明意思就是说这是一个执行回调方法的装饰器,主要应用于传递上下文,或者提供任务的监控/统计信息。看上去正好可以应用于我们这种场景。转载 2022-10-31 17:28:43 · 1961 阅读 · 0 评论 -
当InheritableThreadLocal遇到线程池:主线程本地变量修改后,子线程无法读取到新值
InheritableThreadLocal可以在子线程创建的时候,将父线程的本地变量拷贝到子线程中。那么问题就来了,是只有在创建的时候才拷贝,只拷贝一次,然后就放到线程中的inheritableThreadLocals属性缓存起来。由于使用了线程池,该线程可能会存活很久甚至一直存活,那么inheritableThreadLocals属性将不会看到父线程的本地变量的变化可以看到,由于两次执行复用了同一个线程,所以即使父线程的本地变量发生了改变,子线程的本地变量依旧是首次创建线程时赋的值。转载 2022-10-28 17:52:38 · 1519 阅读 · 0 评论 -
Java线程(篇外篇):线程本地变量ThreadLocal
首先说明ThreadLocal存放的值是线程内共享的,线程间互斥的,主要用于线程内共享一些数据,避免通过参数来传递,这样处理后,能够优雅的解决一些实际问题,比如hibernate中的OpenSessionInView,就是使用ThreadLocal保存Session对象,还有我们经常用ThreadLocal存放Connection,代码如:[java]view plain转载 2017-03-27 10:23:49 · 1279 阅读 · 0 评论 -
ThreadLocal和InheritableThreadLocal深入分析
通过ThreadLocal和InheritableThreadLocal,我们能够很方便的设计出线程安全的类。JDK底层是如何做到的呢?ThreadLocal和InheritableThreadLocal有什么区别呢与联系呢?为什么有了ThreadLocal类还需要InheritableThreadLocal类,他们与Thread类是什么关系?带着这些问题我们来分析他们的源码。ThreadLo...转载 2020-02-08 10:54:19 · 702 阅读 · 0 评论 -
java并发包系列---LockSupport
https://blog.csdn.net/opensure/article/details/53349698长久以来对线程阻塞与唤醒经常我们会使用object的wait和notify,除了这种方式,java并发包还提供了另外一种方式对线程进行挂起和恢复,它就是并发包子包locks提供的LockSupport。LockSupport提供了park和unpark进行线程的挂起和恢复操作...转载 2019-06-13 11:49:58 · 715 阅读 · 2 评论 -
LockSupport概览
https://www.cnblogs.com/lscz3633/p/7605427.htmlBasic thread blocking primitives for creating locks and other synchronization classes.用来创建锁及其他同步类的基础线程阻塞原语。这是java doc中的解释,以下是一个先进先出 (first-in-first-out...转载 2019-06-13 12:03:02 · 604 阅读 · 0 评论 -
LockSupport解析与使用
https://blog.csdn.net/secsf/article/details/78560013https://www.jianshu.com/p/e3afe8ab8364concurrent包是基于AQS (AbstractQueuedSynchronizer)框架的,AQS框架借助于两个类:Unsafe(提供CAS操作) LockSupport(提供park/unp...转载 2019-05-29 18:39:20 · 650 阅读 · 0 评论 -
threadPoolExecutor 中的 shutdown() 、 shutdownNow() 、 awaitTermination() 的用法和区别
最近在看并发编程,在使用到ThreadPoolExecutor时,对它的三个关闭方法(shutdown()、shutdownNow()、awaitTermination())产生了兴趣,同时又感到迷惑。查了些资料,自己写了测试代码,总算有了个比较清晰的认识。下面一起来看看这三个方法:shutdown()将线程池状态置为SHUTDOWN,并不会立即停止:停止接收外部submit的任务内部...转载 2019-06-07 11:50:06 · 8778 阅读 · 1 评论 -
Java并发包基石-AQS详解
https://www.cnblogs.com/chengxiao/archive/2017/07/24/7141160.htmlJava并发包(JUC)中提供了很多并发工具,这其中,很多我们耳熟能详的并发工具,譬如ReentrangLock、Semaphore,它们的实现都用到了一个共同的基类--AbstractQueuedSynchronizer,简称AQS。AQS是一个用来构建锁和同步器...转载 2019-07-16 10:24:18 · 645 阅读 · 0 评论 -
J.U.C之AQS
https://mp.weixin.qq.com/s/-swOI_4_cxP5BBSD9wd0lAAQS简介java的内置锁一直都是备受争议的,在JDK 1.6之前,synchronized这个重量级锁其性能一直都是较为低下,虽然在1.6后,进行大量的锁优化策略,但是与Lock相比synchronized还是存在一些缺陷的:虽然synchronized提供了便捷性的隐式获取锁释放锁机制(基...转载 2019-07-16 10:31:04 · 641 阅读 · 0 评论 -
Java AQS学习
https://www.cnblogs.com/boothsun/p/7880954.htmlAQS 概述AQS简介AQS(AbstractQueuedSynchronizer)就是一个抽象的队列同步器,它是用来构建锁或者其他同步组件的基础框架,它维护了一个volatile int state来表示同步状态,通过内置的FIFO队列来完成线程等待排队。仅仅是定义了若干同步状态获取和释放,...转载 2019-07-16 11:58:42 · 930 阅读 · 0 评论 -
SynchronousQueue使用实例
https://segmentfault.com/a/1190000011207824序本文主要讲一下SynchronousQueue。定义SynchronousQueue,实际上它不是一个真正的队列,因为它不会为队列中元素维护存储空间。与其他队列不同的是,它维护一组线程,这些线程在等待着把元素加入或移出队列。如果以洗盘子的比喻为例,那么这就相当于没有盘架,而是将洗好的盘子直接...转载 2019-07-17 18:03:09 · 951 阅读 · 0 评论 -
LockSupport解析与使用2
https://blog.csdn.net/secsf/article/details/78560013LockSupport提供park()和unpark()方法实现阻塞线程和解除线程阻塞,实现的阻塞和解除阻塞是基于”许可(permit)”作为关联,permit相当于一个信号量(0,1),默认是0. 线程之间不再需要一个Object或者其它变量来存储状态,不再需要关心对方的状态.源码:...转载 2019-05-30 09:36:05 · 813 阅读 · 0 评论 -
SynchronousQueue同步队列 阻塞算法的3种实现
https://www.cnblogs.com/duanxz/p/3252267.html一、SynchronousQueue简介 Java 6的并发编程包中的SynchronousQueue是一个没有数据缓冲的BlockingQueue,生产者线程对其的插入操作put必须等待消费者的移除操作take,反过来也一样。不像ArrayBlockingQueue或LinkedListBlo...转载 2019-05-27 10:35:05 · 1316 阅读 · 0 评论 -
Java并发之AQS详解
https://www.cnblogs.com/waterystone/p/4920797.html一、概述 谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的Ree...转载 2019-03-09 14:17:06 · 810 阅读 · 0 评论 -
[Java并发包学习一]Executor和ExecutorService
本文介绍jdk8并发包中的Executor/ExecutorService这两个接口。Executor接口概述该类提供一个提交任务的方法,提交的任务可以在提交程序本线程运行,也可以在不同的线程运行,也可以在一个线程池中的线程运行,全看如何使用。However, the {@code Executor} interface does not strictlyreq转载 2016-05-24 14:48:58 · 1633 阅读 · 0 评论 -
[Java并发包学习二]Executors介绍
概述Executors类是JDK 1.5开始自带的一个非常强大的主要用于创建各类线程池的工具类。常用方法介绍newFixedThreadPoolnewFixedThreadPool方法有两种函数签名:12public static ExecutorService newFixedThreadPool(int nThreads)转载 2016-05-24 14:49:21 · 1882 阅读 · 0 评论 -
[Java并发包学习三]ThreadFactory介绍
概述ThreadFactory翻译过来是线程工厂,顾名思义,就是用来创建线程的,它用到了工厂模式的思想。它通常和线程池一起使用,主要用来控制创建新线程时的一些行为,比如设置线程的优先级,名字等等。它是一个接口,接口中只有一个方法:123456789/** * Constructs a new {@code Thread}. Im转载 2016-05-24 14:50:31 · 5075 阅读 · 0 评论 -
[Java并发包学习四]Future和FutureTask
概述Future主要用来表示线程异步执行的结果,他提供了检查异步执行的程序是否已经执行完毕、是否已经被取消,并且获取执行结果的方法。它是一个接口,接口的定义如下:12345678public interface Future { boolean cancel(boolean mayInterruptIfRunning);转载 2016-05-24 14:51:14 · 1439 阅读 · 0 评论 -
[Java并发包学习五]CountDownLatch和CyclicBarrier介绍
概述JDK中提供了一些用于线程之间协同等待的工具类,CountDownLatch和CyclicBarrier就是最典型的两个线程同步辅助类。下面分别详细介绍这两个类,以及他们之间的异同点。CountDownLatch类CountDownLatch顾名思义:倒计数锁存器。没错,他就是一个计数器,并且是倒着计数的。他的应用场景如下:一个任务A,他需要等待其他的一些任转载 2016-05-24 14:51:54 · 1059 阅读 · 0 评论 -
[Java并发包学习六]Semaphore介绍
概述emaphore字面意思是信号量。他主要用于控制有限的资源的访问数量。我们看一个生活中常常出现的场景:一个厕所只有3个坑位,但是有10个人来上厕所,那怎么办?假设10的人的编号分别为1-10,并且1号先到厕所,10号最后到厕所。那么1-3号来的时候必然有可用坑位,顺利如厕,4号来的时候需要看看前面3人是否有人出来了,如果有人出来,进去,否则等待。同样的道理,4-10号也需要转载 2016-05-24 14:52:43 · 1007 阅读 · 0 评论 -
[Java并发包学习八]深度剖析ConcurrentHashMap
概述还记得大学快毕业的时候要准备找工作了,然后就看各种面试相关的书籍,还记得很多面试书中都说到:HashMap是非线程安全的,HashTable是线程安全的。那个时候没怎么写Java代码,所以根本就没有听说过ConcurrentHashMap,只知道面试的时候就记住这句话就行了…至于为什么是线程安全的,内部怎么实现的,通通不了解。今天我们将深入剖析一个比Hash转载 2016-05-24 14:53:26 · 1407 阅读 · 0 评论 -
[Java并发包学习九]Java中的阻塞队列
什么是阻塞队列阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。阻塞队列提供了四种处理方法:转载 2016-05-24 14:54:16 · 1244 阅读 · 0 评论 -
Java线程之fork/join框架
fork/join框架是用多线程的方式实现分治法来解决问题。fork指的是将问题不断地缩小规模,join是指根据子问题的计算结果,得出更高层次的结果。fork/join框架的使用有一定的约束条件:1. 除了fork() 和 join()方法外,线程不得使用其他的同步工具。线程最好也不要sleep()2. 线程不得进行I/O操作3. 线程不得抛出checked转载 2017-04-15 11:52:13 · 1747 阅读 · 0 评论 -
多线程并发执行任务,取结果归集。终极总结:Future、FutureTask、CompletionService、CompletableFuture
https://www.cnblogs.com/dennyzhangdd/p/7010972.html目录1.Futrue 原理: demo: 建议:此种方法可实现基本目标,任务并行且按照提交顺序获取结果。使用很普遍,老少皆宜,就是CPU有消耗,可以使用! 2.FutureTask 原理: demo: 建议:demo1在特定场合例如有十分耗时的业务...转载 2018-04-08 18:36:33 · 1266 阅读 · 0 评论 -
Java 并发面试题解
01前言大家好,我是 Eric,一名有多年互联网经验的专业技术从业人员。我最初在一家国际顶尖投行工作时,接触过各个国家形形色色的开发人员。我发现,不论是哪个国家,什么背景的 Java 开发者,都对自己写的并发程序相当自信,但也会在出问题时表现得很诧异甚至一筹莫展。可见,Java 并发编程显然不是一件能速成的能力,基础搭得越好,越全面,在实践中才会有更深刻的理解。因此,大家不难发...转载 2019-01-10 14:00:59 · 2355 阅读 · 3 评论 -
[Java并发包学习七]解密ThreadLocal
概述相信读者在网上也看了很多关于ThreadLocal的资料,很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路;ThreadLocal的目的是为了解决多线程访问资源时的共享问题。如果你也这样认为的,那现在给你10秒钟,清空之前对ThreadLocal的错误的认知!看看JDK中的源码是怎么写的:This class provides thr转载 2016-05-24 14:47:59 · 1308 阅读 · 0 评论