concurrent
文章平均质量分 90
夏目 "
一个对coding有独特追求的人。
展开
-
CompletableFuture 优化你的代码执行效率
在java8以前,我们使用java的多线程编程,一般是通过Runnable中的run方法来完成,这种方式,有个很明显的缺点,就是,没有返回值,这时候,大家可能会去尝试使用Callable中的call方法,然后用Future返回结果,如下:public static void main(String[] args) throws Exception { Execut...原创 2020-01-10 16:46:44 · 9238 阅读 · 0 评论 -
atomic的实现原理
在多线程的场景中,我们需要保证数据安全,就会考虑同步的方案,通常会使用synchronized或者lock来处理,使用了synchronized意味着内核态的一次切换。这是一个很重的操作。 有没有一种方式,可以比较便利的实现一些简单的数据同步,比如计数器等等。concurrent包下的atomic提供我们这么一种轻量级的数据同步的选择。class MyThrea...原创 2018-09-11 11:31:48 · 34313 阅读 · 1 评论 -
Java内存模型 之 happens-before
前面分析了volatile 关键字解析,如何确认多线程调用之间的可见性?我们无法就所有场景来规定某个线程修改的变量何时对其他线程可见,但是我们可以指定某些规则,这规则就是happens-before,从JDK 5 开始,JMM就使用happens-before的概念来阐述多线程之间的内存可见性。在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-bef...转载 2018-04-13 16:50:45 · 4875 阅读 · 0 评论 -
volatile 关键字
Volatile可以看做一种轻量级的锁,但又和锁有些不同。这边看个例子,多线程执行generateSerialNumber时候,每次结果都是不同。private static volatile int serialNum = 0;public static int generateSerialNumber(){ return serialNum++;}问题出在了 serialNum+...原创 2018-04-06 17:02:20 · 2544 阅读 · 0 评论 -
AQS 详解
基本同步器至少要有以下两种类型的方法acquire和releaseacquire:至少要有一个操作能实现对调用线程的阻塞,直到同步器允许它进行操作。release:至少要有一个操作能用一种方式解锁一个或者更多个已经阻塞的线程改变同步状态。同时,同步器还需要支持以下几种功能:非阻塞式的同步过程尝试(tryLock)可选的超时机制,可以允许程序放弃等待可以通过中断执行取消而为了适应不同的同步器,同步器...原创 2018-04-06 15:25:23 · 2946 阅读 · 0 评论 -
CAS 浅析
在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。volatile是不错的机制,但是volatile不能保证原子性。因...转载 2018-04-04 15:40:56 · 2521 阅读 · 0 评论 -
ReentrantLock可重入锁的使用场景
场景1:如果发现该操作已经在执行中则不再执行(有状态执行)a、用在定时任务时,如果任务执行时间可能超过下次计划执行时间,确保该有状态任务只有一个正在执行,忽略重复触发。b、用在界面交互时点击执行较长时间请求操作时,防止多次点击导致后台重复执行(忽略重复触发)。以上两种情况多用于进行非重要任务防止重复执行,(如:清除无用临时文件,检查某些资源的可用性,数据备份操作等)private Reentran...转载 2018-04-11 14:29:29 · 5024 阅读 · 1 评论 -
ReentrantLock实现原理
1.1 synchronized的局限性 synchronized是java内置的关键字,它提供了一种独占的加锁方式。synchronized的获取和释放锁由JVM实现,用户不需要显示的释放锁,非常方便。然而synchronized也有一定的局限性,例如: 1. 当线程尝试获取锁的时候,如果获取不到锁会一直阻塞。 2. 如果获取锁的线程进入休眠或者阻塞,除非当前线程异常,否则其他线程尝试...转载 2018-04-11 10:58:43 · 1967 阅读 · 0 评论 -
无界阻塞延迟队列DelayQueue原理探究
一、前言DelayQueue队列中每个元素都有个过期时间,并且队列是个优先级队列,当从队列获取元素时候,只有过期元素才会出队列。 ● CompareTo(Delayed o):Delayed接口继承了Comparable接口,因此有了这个方法。 ● getDelay(TimeUnit unit):这个方法返回到激活日期的剩余时间,时间单位由单位参数指定。二、 DelayQueue类图结构如图D...转载 2018-04-10 16:49:58 · 1567 阅读 · 0 评论 -
BlockingQueue 使用详解
定义阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满;从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。并...原创 2018-04-09 18:10:45 · 20840 阅读 · 2 评论 -
ConcurrentHashMap 实现原理和源码分析
前言线程不安全的HashMap,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,详细解析 HashMap 实现原理和源码分析 ; 效率低下的HashTable, 使用HashTable的同步方法时,其他线程访问HashTable的同步方法时,可能会进入阻塞或轮询状态 HashMap 和 HashTable 区别; Co...原创 2018-04-09 17:00:55 · 3687 阅读 · 0 评论