随笔分类 - 并发编程拾遗
摘要:线程池整个体系中涉及到三个和线程有关的接口和一个和线程池有关的接口。 Executor 线程池中最顶层的接口,只有一个方法。execute方法接受Runnable类型的task并在未来的某个时刻执行task,执行task有可能用线程池里的线程也有可能用新建的线程。 方法是execute并非submi
阅读全文
摘要:入队 Node AQS同步队列和等待队列共用同一种节点结构Node,与同步队列相关的属性如下。 prev 前驱结点 next 后继节点 thread 入队的线程 入队节点的状态 acquire 模板方法,失败后构造节点、入队、自旋。需要关注的是如果if条件满足会执行selfInterrupt,这个后
阅读全文
摘要:JUC包下的阻塞原语,所谓阻塞原语指的是JUC下所有对线程挂起的操作都是通过LockSupport来完成的。 基本操作 有点像wait notify机制,子线程调用park会被挂起,等待别的线程unpark才会接着park继续执行,且park的线程处于waiting状态。 中断 处于waiting状
阅读全文
摘要:synchronized与Lock接口下的锁的区别 https://www.cnblogs.com/AshOfTime/p/10765295.html wait/notify与Condition的区别 https://www.cnblogs.com/AshOfTime/p/10791842.html
阅读全文
摘要:Condition是为了替代Object的wait notify而设计出来的,其用法基本一致。 都需要先获得锁,然后在锁对象上建立等待队列,把调用wait的线程加入等待队列。 调用wait await后都会释放锁。 都支持等待超时机制。 Condition可响应中断也可以不响应中断(awaitUni
阅读全文
摘要:在jdk5.0之前AQS框架下的锁的性能是远远超过synchronized的,从jdk6.0开始对synchronized做出优化后二者在性能上差异已经不大了。ReentrantLock的有点在于: 灵活性。加锁解锁的过程是可控的,synchronized加锁解锁过程是编译完成后JVM来实现的 可响
阅读全文
摘要:信号量,用于控制并发的线程的数目。信号量在JUC下的实现,每当一个线程进入临界区信号量减少,线程释放锁后信号量增加。 1.1 简单使用 初始化permit为10的信号量,acquire减少2,release增加2,本质上等价于permit=5,acquire release都是1的信号量,并发线程数
阅读全文
摘要:1、简单理解 在jdk1.5之前用于实现简单的等待通知机制,是线程之间通信的一种最原始的方式。考虑这样一种等待通知的场景:A B线程通过一个共享的非volatile的变量flag来实现通信,每当A线程观察到flag为true的时候,代表着有工作需要做,A线程处理任务然后吧flag改成false。B线
阅读全文
摘要:1、新建与运行 新建一个线程的从语法的角度上有两种:1、继承Thread重写run方法 2、实现Runnable接口重写run方法。之所以强调二者的区别在语法的角度是因为最终都是为了新建一个Thread对象,本质上都是调用Thread方法签名为Runnable构造方法。因为从多态的角度来说Threa
阅读全文
摘要:1、解决并发问题的另一种思路 并发编程带来的种种问题的本质在于多个线程对共享变量操作的无序性、非原子性,解决问题的一个思路是用锁或者CAS操作来保证对共享变量修改的原子性,另一个思路是使共享变量私有化。 比如下面开启了两个线程分别用于增加和减少共享变量value,在不使用synchronizes关键
阅读全文

浙公网安备 33010602011771号