
多线程
文章平均质量分 64
little_color
多多交流啊!
展开
-
【并发编程】AQS源码分析(四)通过ReentrantReadWriteLock来查看读写锁的源码实现
前几篇文章分别介绍了AQS的基本的加锁解锁流程,Condition,CountDownLatch共享锁等。这篇文章继续介绍关于ReentrantReadWriteLock相关的原理。原创 2020-09-10 15:39:32 · 203 阅读 · 0 评论 -
【并发编程】AQS源码分析(三) 通过CountDownLatch查看共享锁实现
之前说的ReentrantLock都是从独占锁的角度去探究Lock的具体实现,所以这篇专门来研究一下共享锁与独占锁的区别。要想了解CountDownLatch的具体使用和多线程之间通信的事例,可以先阅读:【多线程】四种种方案实现多线程之间相互协作的通信如果没有AQS基本原理基础可以先看【并发编程】AQS源码分析(一) 从ReentrantLock来看AQS的基本数据结构和主要执行流程【并发编程】AQS源码分析(二)通过生产者和消费者模式理解ReentrantLock的Condition之后再看这原创 2020-08-13 17:03:33 · 303 阅读 · 1 评论 -
【并发编程】AQS源码分析(二)通过生产者和消费者模式理解ReentrantLock的Condition
生产者和消费者模式是并发编程中最常见的需要加锁的场景,既可以通过synchronized + 对象本身的监视器方法wait()、notify()、notifyAll()来实现等待/通知的机制,也可以通过ReentrantLock实现,而ReentrantLock方式可以结合Condition来实现等待/通知的机制。建议:看这篇之前一定要先读懂第一篇,这样理解会容易的多【并发编程】AQS源码分析(一) 从ReentrantLock来看AQS的基本数据结构和主要执行流程下面生产者+消费者代码(Reentr原创 2020-08-11 14:59:15 · 340 阅读 · 0 评论 -
【并发编程】AQS源码分析(一) 从ReentrantLock来看AQS的基本数据结构和主要执行流程
在并发编程中AQS属于必知必会的内容了。AQS全称 AbstractQueuedSynchronizer抽象队列同步器。"抽象"就可以看出他是一个抽象类,我们在用时需要对他进行重写来自定义我们自己的同步器。基本原理既然是同步器,AQS就是在模拟加锁的过程,主要通过CAS原子的去更新变量的状态来达到加锁的效果。当CAS更新失败时,则会构造一个新的节点加入到一个双向链表中(queue)我们称这个双向链表为阻塞队列,节点加入到阻塞队列的对尾,当符合一定的条件后,再去更新变量的状态去获取锁的过程。AQS数据结原创 2020-08-07 16:24:28 · 381 阅读 · 0 评论 -
【多线程高并发】线程池初始化过程、线程池中的阻塞队列
多线程高并发一定少不了线程池技术。作用提升性能 线程的创建和销毁都会消耗一定的性能,通过线程池可以减少线程 的创建和销毁带来的性能消耗。便于管理 方便对线程进行统一的维护管理,比如定时开启,周期执行,并发数控制等参数及含义corePoolSize 核心线程数,队列没满时,线程最大的并发数maximumPoolSize 线程池最大线程数,队列满时,线程最大并发数keepAliveTime 空闲线程的最大存活时间,系统默认只回收非核心线程,核心线程可以通原创 2020-08-04 15:35:49 · 1311 阅读 · 0 评论 -
【高并发】JAVA集合之队列----- (一)概览
说起JAVA中的阻塞队列,就不得不提到JAVA中的集合,队列Queue继承了Collection的所有的方法,也是一种集合的表现形式。原创 2020-06-30 16:58:04 · 285 阅读 · 0 评论 -
【多线程高并发】volatile关键字作用和实现原理
在java中多线程为了实现共享变量能够被准备的更新除了可以使用加排他锁的方式,还有一种更加简单的方式就是对共享变量进行volatile声明。关键字作用保持内存可见性防止指令重排序JMM模型内存可见性指令重排序volatile实现原理...原创 2020-06-23 11:02:58 · 372 阅读 · 0 评论 -
【多线程高并发】synchronized锁升级过程及其实现原理
问:为什么会有锁升级的过程呢?答:在java6以前synchronized锁实现都是重量级锁的形式,效率低下,为了提升效率进行了优化,所以出现了锁升级的过程。问:我们通常说synchronized锁是重量级锁,那么为什么叫他重量级锁?答:因为synchronized执行效率太低。在java1.6以前每次调用synchronized加锁时都需要进行系统调用,系统调用会涉及到用户态和内核态的切换,系统调用会经过0x80中断,经过内核调用后再返回用户态。此过程比较复杂时间比较长所以通常叫synchroniz原创 2020-06-03 15:42:53 · 4401 阅读 · 0 评论 -
【多线程实践】newFixedThreadPool 固定线程池使用
线程池分类:FixThreadPoolCachedThreadPoolScheduledThreadPoolSingleThreadPool详细了解点击几种线程池的简单介绍及代码示例这里简单介绍有关项目中实践中使用的固定线程池的用法。场景介绍 在一个业务逻辑中需要同时生成7份合同(pdf)格式,在生成合同的同时, 不仅需要调用一些外部接口去获取合同中的...原创 2018-03-29 14:27:47 · 9160 阅读 · 1 评论 -
【多线程】四种种方案实现多线程之间相互协作的通信
在并发编程中,经常会遇到多个线程之间需要相互协作的情况,即并不是多个线程同时执行,而是按照一定的顺序循环执行的情况。那么怎样去实现这种效果呢?这里介绍三种方案。这里都以子线程循环10次,然后主线程循环10次,然后往复循环50次的思路来做例子。一、synchronized+notify+waitpublic class communication01 { public stat原创 2016-07-27 14:37:10 · 7448 阅读 · 2 评论 -
【多线程】线程池
Java中的线程池是运用场景最多的并发框架。几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。1、降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。2、提高相应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。3、提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线原创 2016-08-02 21:20:49 · 1173 阅读 · 0 评论