Java并发
文章平均质量分 87
LightOfMiracle
这个作者很懒,什么都没留下…
展开
-
【Java并发】 - ThreadPoolExecutor详解
概述在编写并发应用的时候通常都可以使用线程池,因为比起我们自己手动的去创建新的线程并去开启线程线程池能够通过它自身对于线程的生命周期的管理来完成线程的复用这样就减少了反复创建线程的开销降低了资源的消耗。在Java中Executor接口中只定义了一个简单的功能,它能够执行传来的Runnable的任务。void execute(Runnable command);原创 2017-06-16 12:42:15 · 442 阅读 · 0 评论 -
Java还要再学一遍基础(十五)获取Unsafe
Java中的Unsafe被设计成我们不能随便访问,虽然也可以通过反射获取,但是没有经过严格测试的自己写的代码不能保证它的正确性,这里贴出谷歌api中的Unsafe获取方法,以备后用:private static sun.misc.Unsafe getUnsafe() { try { return sun.misc.Unsafe.getUnsafe(); ...原创 2018-05-31 10:58:41 · 691 阅读 · 0 评论 -
【Java并发】- StampedLock实现浅析
StampedLock实现概述StampedLock与之前的ReentrantLock,ReentrantReadWriteLock使用队列同步列AQS实现有所不同,StampedLock的state改为了一个long型的变量,同时状态的设计也有所不同。同时由于没有使用AQSStampedLock直接在内部实现了同步等待队列,并且节点属性中有一个叫做cowait的分支用于标识另一个等待获取读状态的链原创 2017-06-14 14:02:56 · 1047 阅读 · 0 评论 -
【Java并发】- StampedLock使用
StampedLock概述StampedLock是从JDK1.8开始引入的,它的出现对于ReentrantReadWriteLock在读多写少的情况下的效率问题还有写线程容易产生“饥饿”的问题有了很大的解决。ReentrantReadWriteLock 在沒有任何读写锁时才能获取到写锁,StampedLock认为尝试获取读锁的时候如果有写锁存在不应该是阻塞而是重读,而且在StampedLock的乐观原创 2017-06-14 10:50:37 · 1460 阅读 · 0 评论 -
【Java并发】- ConcurrentHashMap原理解析(Segment版本)(转)
ConcurrentHashMap原理解析原文链接:http://www.iteye.com/topic/1103980ConcurrentHashMap是一个线程安全的哈希表结构,它的主要功能是提供了一组和HashTable功能相同但是线程安全的方法。ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小,不用对整个Conc转载 2017-06-14 15:22:05 · 4206 阅读 · 0 评论 -
【Java并发】- ReentrantReadWriteLock,读写锁原理
ReentrantReadWriteLock(读写锁)读写锁概述ReentrantReadWriteLock,读写锁或者重入读写锁,它维护了一个读锁和一个写锁,可以达到多个读线程可以共享的获取到锁,而此时写线程不能获取到锁,并且当写线程获取到锁时后续的读写都将被阻塞不能获取到锁。读写锁保证了写操作对后续的读操作的可见性。同时ReentrantReadWriteLock还支持重入,公平性选择以及锁的降原创 2017-06-13 15:36:12 · 2541 阅读 · 3 评论 -
【Java并发】- ReentrantLock,重入锁
ReentrantLock概述ReentrantLock(重入锁),顾名思义是可以重新进入的锁,也就是说当一个线程获取了这个锁之后还能在释放锁之前再次获取这个锁,同时还支持公平所和非公平锁的选择。ReentrantLock的重入重入例子synchronized就很好的支持了重入: 例: public class ReentrantLockDemo { public static void m原创 2017-06-13 10:19:09 · 557 阅读 · 0 评论 -
【Java并发】- AbstractQueuedSynchronizer详解(AQS)
AQS简介AQS(队列同步器),是用于构建锁或者同步组件的基础框架,通过使用一个int型的state变量来表示资源(或者同步状态),同时使用内部的一个FIFO队列来实现多个线程获取资源的排队,在构建相应的锁或者同步组件的时候一般都是以继承AQS并实现其中部分关键的方法来达到锁的功能,同时AQS也提供一些状态的读写的方法如:getState(),setState(int newState),compa原创 2017-06-12 13:52:45 · 616 阅读 · 0 评论 -
【Java并发】- 使用CompletionService异步收集任务结果
概述在使用Executor或者直接使用ExecutorService的时候,通常会提交很多个任务同时还需要等待任务的返回结果,这个时候如何快速的回收任务的结果就成了问题。而使用CompletionService可以生产新的异步任务与使用已完成任务的结果分离开来。比如前端页面的图片这种IO的任务,我们并不关心图片的顺序,只是希望能尽快的将图片展示出来。这个时候如果只是顺序的去取图片结果的话,原创 2017-07-03 15:13:03 · 1332 阅读 · 0 评论 -
Java还要再学一遍基础(十六)- DelayQueue使用
概述 DelayQueueDelayed>Delayed 元素的一个无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部 是延迟期满后保存时间最长的 Delayed 元素。如果延迟都还没有期满,则队列没有头部,并且poll 将返回 null。当一个元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一个小于等于 0 的值时,将发生到期。即使无法使用原创 2017-07-03 14:06:47 · 497 阅读 · 0 评论 -
【Java并发】- ScheduledThreadPoolExecutor, ScheduledExecutorService使用
概述 ScheduledExecutorService的接口集成关系:Executor|---ExecutorService|--ScheduledExecutorService原创 2017-07-03 10:06:26 · 1285 阅读 · 1 评论 -
【Java并发】- volatile详解
在这之前需要先了解java内存模型volatile特性可见性。对一个volatile变量的读,总能看到(任意线程)对这个volatile变量最后的写入。原子性。对任意一个volatile单个变量的读/写具有原子性。但是类似于volatile++这种不具有原子性。因为volatile只保单个证读写具有原子性,这里的volatile++相当于1)读volatile的值,2)volatile + 1,原创 2017-06-09 13:18:54 · 544 阅读 · 0 评论 -
【Java并发】- ConcurrentHashMap原理解析(JDK1.8)
ConcurrentHashMap概述在JDK1.8中ConcurrentHashMap的实现方式或者说实现思想相比之前的版本已经相差了很大了,在JDK1.8之前ConcurrentHashMap是采用的是Segment(分段锁)的方式,而JDK1.8中的ConcurrentHashMap则摒弃了原来的做法,同时沿用了JDK1.8中的HashMap的数组+链表+红黑树的方式,同时大量的使用了java原创 2017-06-15 16:05:06 · 1074 阅读 · 0 评论 -
【Java并发】 - Phaser使用(转)
OverviewJava 7的并发包中推出了Phaser,其功能跟CyclicBarrier和CountDownLatch有些重叠,但是提供了更灵活的用法,例如支持动态调整注册任务的数量等。本文在Phaser自带的示例代码基础上进行一下简单的分析。GlossaryRegistration Phaser支持通过register()和bulkRegister(int p转载 2017-06-19 16:33:24 · 1036 阅读 · 0 评论 -
【Java并发】 - Semaphore
概述Semaphore(信号量),通常用于限制某些资源的访问线程数量。通过调用aquire方法获取许可,没有获取到许可则阻塞当前线程直到获取到许可为止。操作完成后通过调用release方法来释放许可,从而允许其他线程去获取许可。同时Semaphore也支持超时的获取方式。从描述来看这基本和AQS的原理和使用方式如出一辙,只是将同步状态设置了一个上界。使用假设一个教室只允许5原创 2017-06-19 14:24:25 · 326 阅读 · 0 评论 -
【Java并发】 - Cyclicbarrier使用以及原理
CyclicBarrier概述 CyclicBarrier顾名思义是一个循环屏障,它允许一个或者多个线程之间互相等待,直到所有的线程都到达某个点这个时候屏障打开。而且这个屏障可以循环的使用。CyclicBarrier使用 假设有五个学生要考试,要求需要等到所有的学生都来齐了之后由老师宣布考试开始然后学生才能开始作答。public class CyclicBarrierD原创 2017-06-19 12:08:46 · 578 阅读 · 0 评论 -
【Java并发】 - CountDownLatch使用以及原理
概述CountDownLatch是一个用来控制并发的很常见的工具,它允许一个或者多个线程等待其他的线程执行到某一操作,比如说需要去解析一个excel的数据,为了更快的解析则每个sheet都使用一个线程去进行解析,但是最后的汇总数据的工作则需要等待每个sheet的解析工作完成之后才能进行,这就可以使用CountDownLatch。使用例子:这里有三个线程(main,threa原创 2017-06-19 09:15:01 · 13372 阅读 · 3 评论