并发编程
汲建帅
这个作者很懒,什么都没留下…
展开
-
阻塞队列和ArrayBlockingQueue源码解析
什么是阻塞队列当队列中为空时,从队列总获取元素的操作将被阻塞,当队列满时,向队列中添加元素的操作将被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,知道其它的线程往队列中插入新的元素。同样,试图往满的队列中添加新元素的线程也会被阻塞,直到有其他的线程使队列重新变的空闲起来。 处理方式 抛出异常 返回特殊值 一直阻塞 超时退出 插入方法 add(e) offer(e)原创 2017-04-20 13:41:46 · 1766 阅读 · 0 评论 -
JAVA 文件锁 FileLock
概述FileLock是java 1.4 版本后出现的一个类,它可以通过对一个可写文件(w)加锁,保证同时只有一个进程可以拿到文件的锁,这个进程从而可以对文件做访问;而其它拿不到锁的进程要么选择被挂起等待,要么选择去做一些其它的事情, 这样的机制保证了众进程可以顺序访问该文件。也可以看出,能够利用文件锁的这种性质,在一些场景下,虽然我们不需要操作某个文件, 但也可以通过 FileLock 来进行原创 2017-12-04 11:54:59 · 4099 阅读 · 0 评论 -
使用DelayQueue 和 FutureTask 实现java中的缓存
使用DelayQueue、ConcurrentHashMap、FutureTask实现的缓存工具类。DelayQueue 简介DelayQueue是一个支持延时获取元素的无界阻塞队列。DelayQueue内部队列使用PriorityQueue来实现。队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素。只有在延迟期满时才能从队列中提取元素。DelayQueue非常原创 2017-08-01 18:11:44 · 2801 阅读 · 0 评论 -
ExecutorCompletionService 源码分析
概要在ExecutorService的submit方法中可以获取返回值,通过Future的get方法,但是这个Future类存在缺陷,Future接口调用get()方法取得处理后的返回结果时具有阻塞性,也就是说调用Future的get方法时,任务没有执行完成,则get方法要一直阻塞等到任务完成为止。 这样大大的影响了系统的性能,这就是Future的最大缺点。为此,java1.5以后提供了Comple原创 2017-07-20 10:30:30 · 1738 阅读 · 0 评论 -
基于ReentrantLock发生死锁的解决方案
概念死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象:死锁。”活锁(英文 livelock)指事物1可以使用资源,但它原创 2017-07-20 10:28:54 · 4348 阅读 · 5 评论 -
FutureTask 源码分析
FutureTask是一个支持取消行为的异步任务执行器。该类实现了Future接口的方法。 如: 1. 取消任务执行 2. 查询任务是否执行完成 3. 获取任务执行结果(”get“任务必须得执行完成才能获取结果,否则会阻塞直至任务完成)。 注意:一旦任务执行完成或取消任务,则不能执行取消任务或者重新启动任务。(除非一开始就使用runAndReset模式运行任务)FutureTas原创 2017-07-20 10:27:44 · 1606 阅读 · 0 评论 -
深入理解 Synchronized
同步synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性 Java中每一个对象都可以作为锁,这是synchronized实现同步的基础。synchronized 常见的三种用法如下: 普通同步方法,锁是当前实例对象 静态同步方法,锁是当前类的class对象 同步方法块,锁是括号里面的对象 通过原创 2017-06-26 15:04:53 · 1723 阅读 · 0 评论 -
Semaphore 源码分析
需要提前了解的知识点: AbstractQueuedSynchronizer 实现原理类介绍Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。比如控制用户的访问量,同一时刻只允许1000个用户同时使用系统,如果超过1000个并发,则需要等待。使用场景比如模拟一个停车场停车信号,假设停车场只有两个车位,一开始两个车位都是空的。这时如果同时来原创 2017-06-26 15:02:20 · 1897 阅读 · 0 评论 -
CountDownLatch 源码分析
1. 类介绍一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。2. 使用场景在一些应用场合中,需要等待某个条件原创 2017-06-26 15:01:22 · 1605 阅读 · 0 评论 -
AbstractQueuedSynchronizer 源码分析
概述Java的内置锁一直都是备受争议的,在JDK 1.6之前,synchronized这个重量级锁其性能一直都是较为低下,虽然在1.6后,进行大量的锁优化策略,但是与Lock相比synchronized还是存在一些缺陷的:虽然synchronized提供了便捷性的隐式获取锁释放锁机制(基于JVM机制),但是它却缺少了获取锁与释放锁的可操作性,可中断、超时获取锁,且它为独占式在高并发场景下性能大打折扣原创 2017-06-26 14:59:43 · 1847 阅读 · 0 评论 -
并发编程基础知识点
上下文切换CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个 任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。这就像我们同时读两本书,当我们在读一本英文的技术书时,发现某个单词不认识,于是便打开中英文字典,但是在放下英文技术书之前,大脑必须先记住这本书读到了多少页的第多少行,原创 2017-06-26 14:58:15 · 1615 阅读 · 0 评论 -
多线程并发下的单例模式
定义:单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。下面通过代码分析下java中,各种单例模式写法的优缺点。1、饿汉模式示例1.1public class Singleton { private Singleton() {} private static Object INSTANCE = new Object(); public原创 2017-06-26 14:55:36 · 1814 阅读 · 0 评论 -
java中的CAS和原子类的实现
CAS的全称为Compare-And-Swap,直译就是对比交换。是一条CPU的原子指令,其作用是让CPU先进行比较两个值是否相等,然后原子地更新某个位置的值,经过调查发现,其实现方式是基于硬件平台的汇编指令,就是说CAS是靠硬件实现的,JVM只是封装了汇编调用,那些AtomicInteger类便是使用了这些封装后的接口。 简单解释:CAS操作需要输入两个数值,一个旧值原创 2017-04-27 14:37:44 · 4401 阅读 · 0 评论 -
java内存模型
前言 在学习java多线程并发编程前,必须要了解java内存模型,只有了解java内存模型,才能知道为什么多线程并发时会出现数据不一致,什么时候需要加锁同步等各种问题。下面只是简单阐述下java内存模型及其相关的概念。内存模型简介 java的并发采用的是共享内存模型(而非消息传递模型)。 Java内存模型(Java Memory Model)描述了Java程序中各种变量(共享变量)原创 2017-04-28 23:07:09 · 1659 阅读 · 0 评论 -
ConcurrentHashMap 原理解析
了解ConcurrentHashMap 实现原理,建议首先了解下HashMap实现原理。 HashMap 源码解析(JDK1.8)为什么要用ConcurrentHashMap HashMap线程不安全,而Hashtable是线程安全,但是它使用了synchronized进行方法同步,插入、读取数据都使用了synchronized,当插入数据的时候不能进行读取(相当于把整个Hashtable都原创 2017-04-23 00:20:02 · 1586 阅读 · 0 评论 -
ReentrantLock 源码分析
公平锁和非公平锁Lock 有两种实现方式,公平锁和非公平锁。Lock 是通过AQS实现锁的机制。AQS中存在一个队列(双向链表)存储所有要获取当前锁的所有线程信息。公平锁:当前线程不立刻获得锁,而是先直进入等待队列中队尾进行排队获取锁。非公平锁:当前线程首先尝试获取一下锁(仅仅尝试一下),如果获取不到,则乖乖的进入到等待队列中去排队。ReentrantReadWriteLock 源码分析类继承原创 2017-04-14 11:44:16 · 1532 阅读 · 0 评论 -
java 限流策略
概要在大数据量高并发访问时,经常会出现服务或接口面对暴涨的请求而不可用的情况,甚至引发连锁反映导致整个系统崩溃。此时你需要使用的技术手段之一就是限流,当请求达到一定的并发数或速率,就进行等待、排队、降级、拒绝服务等。在限流时,常见的两种算法是漏桶和令牌桶算法算法。限流算法令牌桶(Token Bucket)、漏桶(leaky bucket)和计数器算法是最常用的三种限流的算法。原创 2017-10-31 23:29:40 · 2742 阅读 · 1 评论