随笔分类 -  并发

摘要:先前,笔者和大家一起了解了ReentrantReadWriteLock的写锁实现,其实写锁本身实现的逻辑很少,基本上还是复用AQS内部的等待队列思想。下面,我们来看看ReentrantReadWriteLock的读锁实现。 当调用读锁的lock()方法时,会调用到Sync的父类AQS实现的acqui 阅读全文
posted @ 2021-07-08 20:36 北洛 阅读(197) 评论(0) 推荐(0) 编辑
摘要:ReentrantReadWriteLock 前情提要:在学习本章前,需要先了解笔者先前讲解过的ReentrantLock源码解析和Semaphore源码解析,这两章介绍了很多方法都是本章的铺垫。下面,我们进入本章正题ReentrantReadWriteLock。 ReentrantReadWrit 阅读全文
posted @ 2021-07-08 05:39 北洛 阅读(279) 评论(0) 推荐(0) 编辑
摘要:在上一章,我们学习了信号量(Semaphore)是如何请求许可证的,下面我们来看看要如何归还许可证。 可以看到当我们要归还许可证时,不论是调用release()或是release(int permits),都会调用AQS实现的releaseShared(int arg)方法。在releaseShar 阅读全文
posted @ 2021-07-04 18:09 北洛 阅读(257) 评论(0) 推荐(0) 编辑
摘要:Semaphore 前情提要:在学习本章前,需要先了解笔者先前讲解过的ReentrantLock源码解析,ReentrantLock源码解析里介绍的方法有很多是本章的铺垫。下面,我们进入本章正题Semaphore。 从概念上来讲,信号量(Semaphore)会维护一组许可证用于限制线程对资源的访问, 阅读全文
posted @ 2021-07-04 09:36 北洛 阅读(284) 评论(0) 推荐(0) 编辑
摘要:Condition 在上一章中,我们大概了解了Condition的使用,下面我们来看看Condition再juc的实现。juc下Condition本质上是一个接口,它只定义了这个接口的使用方式,具体的实现其实是交由子类完成。 public interface Condition { void awa 阅读全文
posted @ 2021-07-01 19:06 北洛 阅读(162) 评论(0) 推荐(0) 编辑
摘要:ReentrantLock和BlockingQueue 首先,看到这个标题,不要怀疑自己进错文章,也不要怀疑笔者写错,哈哈。本章笔者会从BlockingQueue(阻塞队列)的角度,看看juc包下的阻塞队列是如何使用ReentrantLock。这个章节笔者会介绍部分阻塞队列的源码,但不会着墨过多,我 阅读全文
posted @ 2021-06-30 18:59 北洛 阅读(236) 评论(0) 推荐(0) 编辑
摘要:在了解如何加锁时候,我们再来了解如何解锁。可重入互斥锁ReentrantLock的解锁方法unlock()并不区分是公平锁还是非公平锁,Sync类并没有实现release(int arg)方法,这里会实现调用其父类AbstractQueuedSynchronizer的release(int arg) 阅读全文
posted @ 2021-06-29 12:56 北洛 阅读(263) 评论(0) 推荐(0) 编辑
摘要:ReentrantLock ReentrantLock是一种可重入的互斥锁,它的行为和作用与关键字synchronized有些类似,在并发场景下可以让多个线程按照一定的顺序访问同一资源。相比synchronized,ReentrantLock多了可扩展的能力,比如我们可以创建一个名为MyReentr 阅读全文
posted @ 2021-06-29 05:56 北洛 阅读(430) 评论(0) 推荐(0) 编辑
摘要:Worker 先前,笔者讲解到ThreadPoolExecutor.addWorker(Runnable firstTask, boolean core),在这个方法中工作线程可能创建成功,也可能创建失败,具体视线程池的边界条件,以及当前内存情况而定。 那么,如果线程池当前的状态,是允许创建Work 阅读全文
posted @ 2021-02-28 20:56 北洛 阅读(257) 评论(0) 推荐(1) 编辑
摘要:ThreadPoolExecutor ThreadPoolExecutor是ExecutorService的一种实现,可以用若干已经池化的线程执行被提交的任务。使用线程池可以帮助我们限定和整合程序资源,尽可能避免创建新的线程来执行任务从而降低任务调用的开销,在执行大量异步任务的时候反而能获得更好的性 阅读全文
posted @ 2021-02-25 22:31 北洛 阅读(323) 评论(0) 推荐(0) 编辑
摘要:线程池 假设我们编写了一个Servlet应用,当用户通过浏览器发起一个请求到达我们服务器时,传统的Servlet应用一般针对一个用户请求创建一个线程去执行请求,等到请求执行完毕后,再销毁线程。这种设计在用户量几百或者几千的情况下一般不会有什么大问题,但是如果我们的用户量上达几万甚至几十万几百万,频繁 阅读全文
posted @ 2021-02-16 18:56 北洛 阅读(183) 评论(0) 推荐(0) 编辑
摘要:volatile原理 Java虚拟机规范中定义了Java内存模型(Java Memory Model,即JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现Java程序在各个平台下都能达到一致的并发效果。 Java内存模型中规定所有的变量都存储在主内存,每个线程都有自己独立的工作内存,线程的工作 阅读全文
posted @ 2021-02-03 20:19 北洛 阅读(221) 评论(0) 推荐(0) 编辑
摘要:并发的优势与风险 优势 速度:同时处理多个请求,响应更快;复杂的操作可以同时分成多个进程或者线程同时进行。 设计:程序设计在某些情况下变得更简单。 资源利用:CPU可以在等待IO的时候做其他的事情。 风险 安全性:多个线程同时读写数据可能会产生于期望不相符的结果。 活跃性:某个操作无法进行下去时,就 阅读全文
posted @ 2021-01-24 17:06 北洛 阅读(173) 评论(0) 推荐(0) 编辑
摘要:并发 很多程序员应该对并发一词并不陌生,并发如同一把双刃剑,如果使用得当,可以帮助我们更好的压榨硬件的性能,反之,也会产生一些难以排查的问题。这里,先简单介绍下并发的几个基本概念。 进程与线程 进程:进程是操作系统进行资源分配和调度的基本单位。 线程:线程是操作系统能够进行运算调度的最小单位,它被包 阅读全文
posted @ 2021-01-05 19:56 北洛 阅读(343) 评论(2) 推荐(0) 编辑