
JAVA并发编程
文章平均质量分 95
JAVA并发编程
犬豪
行我所行,无问西东
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java并发编程(二十)JUC线程池(ScheduledThreadPoolExecutor)
ScheduledThreadPoolExecutor1.1 API介绍构造线程池Executors使用 newScheduledThreadPool 工厂方法创建ScheduledThreadPoolExecutor:public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { return new ScheduledThreadPoolExecutor(corePoolSize);}pu原创 2021-01-10 15:08:13 · 245 阅读 · 0 评论 -
Java并发编程(十九)JUC线程池(自定义线程池ThreadPoolExecutor)
一、自定义线程池ThreadPoolExecutor上一节我们演示了利用Executors创建了三种类型的线程池,但是实际生产环境中,我们是不会用这种方式创建线程池的,主要原因就是这些线程池用的阻塞队列没有限制容量,容易引发内存溢出的问题。首先在来回顾一下ThreadPoolExecutor构造的七个参数:1.1 ThreadPoolExecutor构造的七个参数/*** 使用给定的参数创建ThreadPoolExecutor.** @param corePoolSize 核心线程池中的核心线原创 2021-01-10 14:59:19 · 370 阅读 · 0 评论 -
Java并发编程(十八)JUC线程池(Executor、Callable、FutureTask、ThreadPoolExecutor)
一、Executor框架Executor框架包括3大部分:任务。也就是工作单元,包括被执行任务需要实现的接口:Runnable接口或者Callable接口;任务的执行。也就是把任务分派给多个线程的执行机制,包括Executor接口及继承自Executor接口的ExecutorService接口。异步计算的结果。包括Future接口及实现了Future接口的FutureTask类。Executor框架的成员及其关系可以用一下的关系图表示:Executor框架的使用示意图:使用步骤:创原创 2021-01-10 14:52:45 · 398 阅读 · 0 评论 -
Java并发编程(十七)JUC同步器工具(CyclicBarrier、Exchanger、Phaser)
一、CyclicBarrier 篱栅1.1 API介绍官方案例略isBroken:判断是否有线程等待的过程中是否被中断了,如果有就等不到每个线程都到达Barrier点CountDownLatch是一个倒数计数器,在计数器不为0时,所有调用await的线程都会等待,当计数器降为0,线程才会继续执行,且计数器一旦变为0,就不能再重置了。CyclicBarrier可以认为是一个栅栏,栅栏的作用是什么?就是阻挡前行。CyclicBarrier是一个可以循环使用的栅栏,它做的事情就是:让线程原创 2021-01-10 11:52:43 · 459 阅读 · 0 评论 -
Java并发编程(十六)JUC同步器工具(Semaphore、CountDownLatch)
一、Semaphore 信号量1.1 API介绍Semaphore(信号量)是用来控制同时访问特定资源的线程数量,通过协调各个线程,保证合理的使用公共资源。Semaphore维护了一个许可集,其实就是一定数量的“许可证”。当有线程想要访问共享资源时,需要先获取(acquire)的许可;如果许可不够了,线程需要一直等待,直到许可可用。当线程使用完共享资源后,可以归还(release)许可,以供其它需要的线程使用。和ReentrantLock类似,Semaphore支持公平/非公平策略。源码:原创 2021-01-09 18:01:51 · 221 阅读 · 0 评论 -
Java并发编程(十五)JUC阻塞队列(SynchronousQueue、LinkedTransferQueue)
一、SynchronousQueue1.1 API介绍SynchronousQueue是一个没有数据缓冲的BlockingQueue,生产者线程对其的插入操作put必须等待消费者的移除操作take,反过来也一样。SynchronousQueue内部并没有数据缓存空间,你不能调用peek()方法来看队列中是否有数据元素,因为数据元素只有当你试着取走的时候才可能存在,不取走而只想偷窥一下是不行的,当然遍历这个队列的操作也是不允许的。数据是在配对的生产者和消费者线程之间直接传递的,并不会将数据缓冲到队列中原创 2021-01-09 16:33:44 · 302 阅读 · 0 评论 -
Java并发编程(十四)JUC阻塞队列(LinkedBlockingQueue、LinkedBlockingDeque)
一、LinkedBlockingQueue1.1 API介绍链式阻塞队列分单向(LinkedBlockingQueue)、双向(LinkedBlockingDeque)链表里面元素的存储是离散的,分散在内存区不同地方,不需要连续的存储区间FIFO:first in first outLinkedBlockingQueue是一个基于单向链表的、范围任意的(其实是有界的)、FIFO 阻塞队列。访问与移除操作是在队头进行,添加操作是在队尾进行,并分别使用不同的锁进行保护,只有在可能涉及多个节点的操作原创 2021-01-09 13:30:27 · 377 阅读 · 0 评论 -
Java并发编程(十三)JUC阻塞队列(BlockingQueue、ArrayBlockingQueue、PriorityBlockingQueue、DelayQueue)
一、BlockingQueue1.1 什么是阻塞队列?阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。阻塞队列提供了四种处理方法:方法\处理方式抛出异常返回特殊值一直阻塞超时退出原创 2021-01-09 12:59:52 · 448 阅读 · 0 评论 -
Java并发编程(十二)JUC阻塞队列(概念、生产者消费者模型)
一、阻塞队列1.1 概念比如12306服务器并发支持10W,突然来30W请求肯定会冲垮服务器,所以用阻塞队列,把后20W请求放入队列,等服务器处理完一部分,在从队列里取一部分,限流削峰思想。放入队列可以放入内存中,也可以持久化,持久化的方式就是消息中间件。概念:在多线程领域:所谓阻塞,在某些情况下会挂起线程(即阻塞),⼀旦条件满⾜,被挂起的线程⼜会⾃动被唤醒。阻塞队列 是⼀个队列,在数据结构中起的作⽤如下图:当队列是空的,从队列中获取(Take)元素的操作将会被阻塞当队列是满的,从队原创 2021-01-08 18:49:00 · 331 阅读 · 0 评论 -
Java并发编程(十一)JUC并发集合(ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet)
一、ConcurrentHashMap1.1 HashMapHashMap容量/*** Constructs an empty <tt>HashMap</tt> with the specified initial* capacity and load factor.** @param initialCapacity the initial capacity* @param loadFactor the load factor* @throws IllegalArg原创 2021-01-08 17:59:25 · 491 阅读 · 0 评论 -
Java并发编程(十)JUC并发集合(CopyOnWriteArrayList、CopyOnWriteArraySet)
一、CopyOnWriteArrayList1.1 ArrayList多线程不安全问题ArrayList 不是线程安全类,在多线程同时写的情况下,会抛出java.util.ConcurrentModificationException 异常。/** * 集合类不安全问题 */public class ContainerNotSafeDemo { public static void main(String[] args) { listNoSafe(); }原创 2021-01-08 16:42:33 · 259 阅读 · 0 评论 -
Java并发编程(九)JUC原子操作类(原子基本数据类型、原子数组、原子引用类型、原子更新字段类型)
原子操作类在并发编程中很容易出现并发安全的问题,有一个很简单的例子就是多线程更新变量i=1,比如多个线程执行i++操作,就有可能获取不到正确的值,而这个问题,最常用的方法是通过Synchronized进行控制来达到线程安全的目的。但是由于synchronized是采用的是悲观锁策略,并不是特别高效的一种解决方案。实际上,在J.U.C下的atomic包提供了一系列的操作简单,性能高效,并能保证线程安全的类去更新基本类型变量,数组元素,引用类型以及更新对象中的字段类型。atomic包下的这些类都是采用的乐观锁原创 2021-01-08 15:45:33 · 465 阅读 · 0 评论 -
Java并发编程(八)JUC锁(条件队列 Condition、AQS)
一、Condition1.1 API介绍可以看到Condition是一个接口,它的实现类在AbstractQueuedLongSynchronizer, AbstractQueuedSynchronizer中,都叫ConditionObject官方文档给的例子: class BoundedBuffer { final Lock lock = new ReentrantLock(); final Condition notFull = lock.newCondition();原创 2021-01-08 14:32:05 · 495 阅读 · 0 评论 -
Java并发编程(七)JUC锁(独占共享锁/读写锁、ReentrantReadWriteLock、LockSupport)
LockSupport整个Lock章节中前面介绍的所有锁,底层真正让线程阻塞实际上都是调用的LockSupport的park方法。API介绍LockSupport类,是JUC包中的一个工具类,定义了一组静态方法,提供最基本的线程阻塞和唤醒功能,是构建同步组件的基础工具,用来创建锁和其他同步类的基本线程阻塞原语。LockSupport类的核心方法其实就两个:park() 和 unpark(),其中 park() 方法用来阻塞线程,unpark()方法用于唤醒指定线程。和Object类的wait()原创 2021-01-08 11:55:22 · 361 阅读 · 0 评论 -
Java并发编程(六)JUC介绍、JUC锁(公平锁、非公平锁、可重入锁/递归锁、自旋锁、ReentrantLock)
一、JUC介绍JUC就是指java.util.concurrent包下的接口、类,为并发编程提供便利。是在JDK 1.5 之后加入的。我们可以通过官网查看JDK API文档,JDK从9开始按模块划分了,并且文档开始支持搜索功能,所以我们直接看JDK9的文档:https://docs.oracle.com/javase/9/docs/api/overview-summary.html选择java.base:在这里我们找到关于juc的三个包:java.util.concurrent:这个包包括原创 2021-01-07 18:34:46 · 664 阅读 · 1 评论 -
Java并发编程(五)并发编程基础(本地线程、多线程问题)
一、本地线程1.1 ThreadLocalJava中的ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的ThreadLocal变量。如何创建ThreadLocal变量以下代码展示了如何创建一个ThreadLocal变量:private ThreadLocal myThreadLocal = new ThreadLocal();我们可以看到,通过这段代码实例化了一个Thr原创 2021-01-07 14:34:13 · 256 阅读 · 0 评论 -
Java并发编程(四)并发编程基础(悲观锁与synchronized)(偏向锁、轻量级锁、锁优化)
Synchronized块1.1 基础Java中的同步块用synchronized标记。同步块在Java中是同步在某个对象上。所有同步在一个对象上的同步块在同时只能被一个线程进入并执行操作。所有其他等待进入该同步块的线程将被阻塞,直到执行该同步块中的线程退出。有四种不同的同步块:实例方法静态方法实例方法中的同步块静态方法中的同步块上述同步块都同步在不同对象上。实际需要那种同步块视具体情况而定。实例方法同步下面是一个同步的实例方法:public synchronized void a原创 2021-01-06 18:43:20 · 336 阅读 · 0 评论 -
Java并发编程(三)并发编程基础(乐观锁与CAS)
一、CAS乐观锁1.1 思考看下⾯代码进⾏思考,此时number前⾯是加了volatile关键字修饰的,volatile不保证原⼦性,那么使⽤AtomicInteger是如何保证原⼦性的?这⾥的原理是什么?CASclass MyData { volatile int number = 0; AtomicInteger atomicInteger=new AtomicInteger(); public void addPlusPlus(){ number++; } public原创 2021-01-06 15:40:35 · 337 阅读 · 0 评论 -
Java并发编程(二)并发编程基础(临界资源、线程安全、JAVA内存模型、volatile关键字)
一、临界资源临界资源是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式,实现共享的资源称作临界资源。属于临界资源的硬件有,打印机,磁带机等;软件有消息队列,变量,数组,缓冲区等。诸进程间采取互斥方式,实现对这种资源的共享。public class Counter { protected long count = 0; public void add(long value){ this.count = this.count + value; }}二、线程安全2.1 基本概念原创 2021-01-06 14:06:03 · 751 阅读 · 0 评论 -
Java并发编程(一)认识并发编程 之 线程与多线程
一、线程1.1 进程和线程进程进程:进程指正在运行的程序,进程拥有一个完整的、私有的基本运行资源集合。通常,每个进程都有自己的内存空间。进程往往被看作是程序或应用的代名词,然而,用户看到的一个单独的应用程序实际上可能是一组相互协作的进程集合。为了便于进程之间的通信,大多数操作系统都支持进程间通信(IPC),如pipes 和sockets。IPC不仅支持同一系统上的通信,也支持不同的系统。IPC通信方式包括管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等方式原创 2021-01-05 17:00:06 · 333 阅读 · 0 评论