并发
并发
鹿与森呀
这个作者很懒,什么都没留下…
展开
-
原子操作的实现
目录原子操作处理器实现原子操作Java如何实现原子操作1.锁2.CAS循环原子操作不可中断的一个或一系列操作。处理器实现原子操作 通过总线锁保证原子性,所谓总线锁就是使用处理器提供的一个LOCK #信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住,那么该处理器可以独占共享内存。 通过缓存锁保证原子性,所谓缓存锁是指内存区域如果被缓存...原创 2020-01-12 23:54:14 · 437 阅读 · 0 评论 -
volatile、synchronized、final
目录一、volatile(一)什么是volatile(二)volatile的实现(三)volatile内存语义二、synchronized(一)什么是synchronized(二)锁优化1.偏向锁2.轻量级锁(三)synchronized的实现(四)synchronized的使用三、final(一)什么是final1.final类2.fi...原创 2020-01-12 22:39:35 · 697 阅读 · 0 评论 -
Java并发编程的问题与挑战
目录一、并发的关键问题1.1 线程之间如何通信1.2 线程之间如何同步二、并发的挑战:2.1 上下文切换2.1.1 如何减少上下文切换:2.2 死锁2.2.1 如何避免死锁:2.3 资源限制一、并发的关键问题1.1 线程之间如何通信通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型...原创 2019-12-22 23:04:43 · 283 阅读 · 0 评论 -
Java线程
目录什么是线程线程的实现线程优先级线程的状态守护线程线程中断安全地终止线程ThreadLocal什么是线程线程是比进程更轻量级的调度执行单位,现代操作系统调度的最小单元是线程,也叫轻量级进程,在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆、栈和局部变量等属性,并且能够访问共享的内存变量。线程的实现Java线程在JDK1.2之前,是基于成...原创 2019-12-29 16:29:26 · 269 阅读 · 0 评论 -
Java内存模型
目录一、物理机内存模型(一)缓存一致性(二)指令重排序二、Java内存模型(一)主内存与工作内存(二)内存间交互操作(三)从源代码到指令序列的重排序(四)重排序规则1.数据依赖性2.as-if-serial语义3.先行发生原则(happens-before)一、物理机内存模型首先,了解一下物理计算机并发的问题,了解物理机的并发解决方案对虚拟机的...原创 2020-01-05 11:50:02 · 407 阅读 · 0 评论 -
队列同步器AbstractQueueSynchronizer
目录什么是队列同步器队列同步器的实现同步队列独占式同步状态获取与释放共享式同步状态获取与释放等待队列队列同步器使用什么是队列同步器队列同步器是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。同步器的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态,在抽象方...原创 2019-12-30 23:34:46 · 349 阅读 · 1 评论 -
原子性、可见性和有序性
原子性(Atomicity)由Java内存模型来直接保证的原子性变量操作包括read、load、assign、use、store和write,我们大致可以认为基本数据类型的访问读写是具备原子性的。Java内存模型提供了lock和unlock来保证更大范围的原子操作,尽管虚拟机未把lock和unlock操作直接开放给用户使用,但是却提供了更高层次的字节码指令monitorenter和moni...原创 2020-01-12 12:08:49 · 239 阅读 · 0 评论 -
compareAndSet和weakCompareAndSet区别
JDK1.9以前,两者底层实现是一样的,并没有严格区分。JDK 1.9提供了Variable Handles的API,主要是用来取代java.util.concurrent.atomic包以及sun.misc.Unsafe类的功能。Variable Handles需要依赖jvm的增强及编译器的协助,即需要依赖java语言规范及jvm规范的升级。VarHandle中compareAndSet和c...原创 2020-01-01 21:34:25 · 3268 阅读 · 0 评论 -
Java阻塞队列(BlockingQueue)
目录什么是阻塞队列阻塞队列支持的方法阻塞队列的实现原理1.Condition2.LockSupportJava中的阻塞队列什么是阻塞队列阻塞队列(BlockingQueue)是一个附加支持阻塞的插入和移除的队列。 支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程,直到队列不满。 支持阻塞的移除方法:当队列为空时,队列会阻塞插入元素的线程,知道...原创 2019-12-28 17:29:41 · 342 阅读 · 0 评论 -
Java中的锁
Lock接口在Lock接口出现之前,Java程序是靠synchronized关键字实现所功能的。而JDK1.5之后,并发包中新增了Lock接口(以及实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是使用时需要显式地获取和释放锁。Lock接口提供的synchronized关键字不具备的主要特性:特性 描述 尝试非阻塞的获取 当前线程尝试...原创 2020-01-09 23:30:24 · 588 阅读 · 0 评论 -
Java并发工具类
倒计时锁(CountDownLatch)CountDownLatch允许一个或多个线程等待其他线程完成操作。同步屏障(CyclicBarrier)CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续执行。信号量(Semaphore)Semaphore是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源原创 2020-01-12 00:32:29 · 96 阅读 · 0 评论 -
Java线程池和Executor框架
线程池的好处 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性。使用线程池可以对线程进行统一分配、调优和监控。 线程池的实现原理Java的线程即是工作单元,也是执行机制。从JDK 1.5开始,把工作单元和执行机制分离开来。工作单元包括Runnable和Ca...原创 2019-12-29 20:50:53 · 294 阅读 · 0 评论 -
Java线程池关闭
import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.Executors;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class ShutDownExam...原创 2019-12-30 13:24:15 · 219 阅读 · 0 评论 -
Fork/Join框架
什么是Fork/Join框架Fork/Join框架是Java7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。基本原理就是分而治之。Fork/Join实现原理工作窃取算法,是指某个线程向其他队列窃取任务来执行。将一个较大的任务拆分,多队列多线程去执行,线程和队列一一对应。先完成自己任务队列的会去别的任务队列去窃取一个任务...原创 2019-12-31 23:03:22 · 138 阅读 · 0 评论 -
Java原子操作类
目录原子操作类原子基本类型原子数组类型原子引用类型原子更新字段类型原子操作类JDK1.5开始提供了java.util.concurrent.atomic包,包下13个类,属于4种类型的原子更新方式,分别是原子更新基本类型、原子更新数组、原子更新引用和原子更新属性(字段)。JDK1.8新增了DoubleAccumulator、LongAccumulator、DoubleA...原创 2020-01-07 23:28:25 · 266 阅读 · 0 评论