随笔 - 16
文章 - 0
评论 - 3
阅读 -
19469
随笔分类 - java / java并发编程
Java中的线程池使用及原理
摘要:## 开篇-为什么要使用线程池? Java 中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来 3 个好处。 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二:提高响应速度。当任
阅读全文
Java并发工具CountDownLatch的使用和原理
摘要:## 1.等待多线程完成的 CountDownLatch CountDownLatch 允许一个或多个线程等待其他线程完成操作。 假如有这样一个需求:我们需要解析一个 Excel 里多个 sheet 的数据,此时可以考虑使用多线程,每个线程解析一个 sheet 里的数据,等到所有的 sheet 都解
阅读全文
结合ReentrantLock来看AQS的原理
摘要:### AQS的定义 队列同步器 AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组件的基础框架,它使用了一个 int 成员变量表示同步状态,通过内置的 FIFO 队列来完成资源获取线程的排队工作,并发包的作者(Doug Lea)期望它能够成为实现
阅读全文
java 线程等待和唤醒方法
摘要:### java线程状态变迁图  从图中可以看出Java 线程等待方法是将线程从Runnable状态转换为Waiti
阅读全文
volatile是如何保证有序性的?
摘要:#### 为什么需要保证有序性? 有如下代码,在int i = a;执行了的情况下,i的值最终会为几? ``` public class NoVolatileExample { int a = 0; boolean flag = false; public void writer() { a = 1
阅读全文
happens-before 原则
摘要:#### happens-before 简述 从 JDK 5 开始,Java 使用新的 JSR-133 内存模型。JSR-133 使用 happens-before 的概念来阐述操作之间的**内存可见性**。在 JMM 中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在 h
阅读全文
java cas是如何保证原子性的
摘要:#### 汇编指令CMPXCHG * 在了解CAS之前我们先看看汇编指令CMPXCHG,CMPXCHG的完整名称是Compare and Exchange,CMPXCHG汇编指令的使用方法如下: `cmpxchg dest,src` 将AL、AX、EAX或RAX寄存器中的值与第一个操作数dest(目
阅读全文
java volatile是如何保证可见性的?
摘要:### lock前缀指令干的事。 volatile 修饰的变量在进行写操作时会多出一条如下的汇编指令: `lock addl $0x0,(%esp)` volatile就是靠这个lock前缀指令去实现可见性的,当对volatile修饰的共享变量进行写操作时,lock前缀的指令在多核处理器下会引发两件
阅读全文