多线程
入门到骨灰
人圭日月
未来,加油!
展开
-
TreeMap\TreeSet和ConcurrentSkipListMap\ConcurrentSkipListSet
ConcurrentSkipListMap提供了一种线程安全的并发访问的排序映射表。内部是SkipList(跳表)结构实现,在理论上能够在O(log(n))时间内完成查找、插入、删除操作。SkipList是一种红黑树的替代方案,由于SkipList与红黑树相比无论从理论和实现都简单许多,所以得到了很好的推广。SkipList是基于一种统计学原理实现的,有可能出现最坏情况,即查找和更新操作都是O(n)时间复杂度,但从统计学角度分析这种概率极小。使用SkipList类型的数据结构更容易控制多线程对集合访问的原创 2020-05-15 22:10:50 · 286 阅读 · 0 评论 -
DelayQueue实际运用转载
DelayQueue是一个无界阻塞队列,可以用做延时处理,所谓延时处理就是说可以为队列中元素设定一个过期时间,其中的元素只有在时间到期时才能从中被提取。该队列的头部是延迟期满后保存时间最长的Delayed 元素。存放到DelayDeque的元素必须继承Delayed接口。Delayed接口使对象成为延迟对象,它使存放在DelayQueue类中的对象具有了激活日期。该接口强制实现下列两个方法。Co...原创 2020-05-06 22:34:44 · 143 阅读 · 0 评论 -
SynchronousQueue 转载
https://blog.csdn.net/hudashi/article/details/7076814SynchronousQueue是这样 一种阻塞队列,其中每个 put 必须等待一个 take,反之亦然。同步队列没有任何内部容量,甚至连一个队列的容量都没有。不能在同步队列上进行 peek,因为仅在试图要取得元素时,该元素才存在;除非另一个线程试图移除某个元素,否则也不能(使用任何方...原创 2020-05-06 21:03:40 · 103 阅读 · 0 评论 -
java 跳表
转载简书https://www.jianshu.com/p/60d2561b821c原创 2020-05-05 11:35:00 · 113 阅读 · 0 评论 -
ArrayBlockingQueue、PriorityBlockingQueue、LinkedBlockingQueue的使用
`ArrayBlockingQueue` 是一个先进先出的有界队列,初始化容量后,无法进行修改apiadd 超出队列会报错 java.lang.IllegalStateException: Queue full (对应的remove 方法)offer 添加返回true 和 falseput 会阻塞 (对应的take)poll 拿不出来,返回nullpeek 只拿出第一位,不会删...原创 2020-05-05 22:04:03 · 378 阅读 · 0 评论 -
ScheduleExecutorService得使用
ScheduleExecutorService 效果和quartz 得效果差不多实际开发中还是用quartz 比较好,但是看场景吧api 得使用public class ScheduleExecutorServiceTest { private static Runnable blockRunner = () -> { try { Ti...原创 2020-04-25 10:06:27 · 174 阅读 · 0 评论 -
ExecutorCompletionService 的使用
Future 有一个问题就是,他的get 方法是把全部数据处理完再拿出来的。ExecutorCompletionService 可以做到拿一条输出一条 public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executo...原创 2020-04-19 22:26:53 · 247 阅读 · 0 评论 -
Future的API使用
get() 方法是阻塞得get(10,TimeUnit.SECONDS) get 的超时方法,线程里面并不会死掉isDone() 判断有没有做完cancel() 取消(代码里详细记录)public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutExcepti...原创 2020-04-19 18:09:04 · 779 阅读 · 0 评论 -
java线程池使用
所有的线程执行都是围绕着ExecutorExecutor 本身事不具备线程池执行能力,ExecutorService 添加了一些操作原创 2020-04-19 15:12:10 · 362 阅读 · 0 评论 -
phaser 使用
摘抄:https://www.jianshu.com/p/1517a379fb91可参考:https://www.iteye.com/blog/shift-alt-ctrl-2302923常用方法1,设定任务数(这是官方解释,简单的讲比如我们指定任务数为3,那3个线程都运行到指定地方他们才会分别继续往下执行)\\批量设置任务数public int bulkRegister(int p...原创 2020-04-04 16:55:42 · 253 阅读 · 0 评论 -
StampedLockd实现读写锁
廖雪峰老师的亲笔,我偷来的知识转载:https://www.liaoxuefeng.com/wiki/1252599548343744/1309138673991714前面介绍的ReadWriteLock可以解决多线程同时读,但只有一个线程能写的问题。如果我们深入分析ReadWriteLock,会发现它有个潜在的问题:如果有线程正在读,写线程需要等待读线程释放锁后才能获取写锁,即读的过程中不...原创 2020-04-02 21:15:15 · 238 阅读 · 0 评论 -
多线程 condition 使用
Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition的await()、signal()这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition,阻塞队列实际上是使用了Condition来模拟线程间协作。Condition...原创 2020-03-31 22:02:51 · 154 阅读 · 0 评论 -
可重入锁和不可重入锁概念和区别(顺便介绍一下ReentrantLock和ReentrantReadWriteLock)
文章转载自:https://blog.csdn.net/u013452335/article/details/86576939概念可重入锁就是一个类的A、B两个方法,A、B都有获得统一把锁,当A方法调用时,获得锁,在A方法的锁还没有被释放时,调用B方法时,B方法也获得该锁。这种情景,可以是不同的线程分别调用这个两个方法。也可是同一个线程,A方法中调用B方法,这个线程调用A方法。不可重入锁就...原创 2020-03-30 22:06:44 · 309 阅读 · 0 评论 -
Semaphore 简单使用
文字摘抄于:https://yq.aliyun.com/articles/632589Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。换句话说,锁(Lock锁或synchronized锁)在任何时刻只允许一个任务访问被加锁的资源,而计数信号量允许n个任务同时访问这个资源,还可以将信号量看作是向外分发使用资源的“许可证”,尽管内部没有...原创 2020-03-22 22:07:29 · 106 阅读 · 0 评论 -
Exchanger 简单了解
文字摘要于:https://yq.aliyun.com/articles/632589Exchanger(交换者)是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据,如果第一个线程先执行exchange()方法,它会一直等待第二个线程也 执行exchange方法,当两个线...原创 2020-03-22 20:39:07 · 232 阅读 · 0 评论 -
CyclicBarrier 使用
CyclicBarrier 原理和countDownLatch 差不多,都是等大家任务都做完了,再执行下面的步骤。但是使用上还是有点区别的。public class Test { public static void main(String[] args) { /** * CyclicBarrier(int parties, Runnable barrierAc...原创 2020-03-16 22:11:00 · 97 阅读 · 0 评论 -
CountDownLatch 使用场景
/** * 第一个使用场景 * 数据使用多线程的方式处理 */public class CountDownLatchTest { private static ExecutorService executor = newFixedThreadPool(2); private static final CountDownLatch latch = new CountDow...原创 2020-03-15 21:27:33 · 142 阅读 · 0 评论 -
Atomic XXX 的原子操作
我们知道volitale 关键字他是不具备原子性的,但是Atomic XXX 都是具备原子性操作public static void main(String[] args) { //AtomicInteger AtomicInteger atomicInteger = new AtomicInteger(); System.out.println(ato...原创 2020-03-15 16:48:47 · 104 阅读 · 0 评论 -
设计模式- 主动对象(Active Object)
以下两段文言摘抄自https://blog.csdn.net/qq276592716/article/details/19421359流程对每一个要求并发执行的对象,分离其方法的调用和执行。这样,这个对象的客户就像是调用一个常规的方法一样。这个方法,自动把任务交给另外的线程完成执行。主动对象的组成:一个代理者(Proxy)实现外部的访问接口;一个执行者(Servant)。代理和执行者在不同的...原创 2020-03-11 20:28:06 · 679 阅读 · 0 评论 -
CountDown 实现原理
如果在主线程中,使用线程,要使主线程在线程后面运行,那么要添加 join现在我们可以使用countdownlatch 来决定。那么先模拟一下,countdownlatch 的实现吧public class CountDown { private final int total; private int counter = 0; public CountDown(...原创 2020-03-08 15:49:56 · 429 阅读 · 0 评论 -
ThreadLocal及应用
threadlocal一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据。static final ThreadLocal<T> threadLocal = new ThreadLocal<T>();threadLocal.set("aa");threadLocal.get();他的实现原理大致可以这样理解:通过线程的名字...原创 2020-03-07 16:35:42 · 73 阅读 · 0 评论 -
保护性暂挂模式(Guarded Suspension)
核心思想如果某个线程执行特定的操作前需要满足一定的条件,则在该条件未满足时将线程暂停运行(即暂挂线程,使其处于等待(waiting)状态,直到该条件满足时才继续运行)public class Requets{ final private String value; public Requets(String value) { this.value = val...原创 2020-03-06 22:10:17 · 173 阅读 · 0 评论 -
多线程中Future的原理
通过Future 异步回调,不阻塞下面的执行,并且在方法最后执行完毕前,调用方法或通过回调的方法获取返回值。其核心其实就是创建一个线程这也是多线程的一个设计模式public interface Future<T> { T get() throws InterruptedException;}这边在方法中添加synchronized 关键字,就是防止多线程问题。p...原创 2020-03-06 16:23:19 · 460 阅读 · 0 评论 -
读写锁实现原理
仅模拟读写锁的实现原理,具体使用还是Java并发包中ReadWriteLock读写锁的原理读和读互不影响,读和写互斥,写和写互斥部分逻辑可参考,但是下面的代码时有问题的,比如统计读写锁的统计,尚且不添加volitile关键字就是一大错误了。代码实现...原创 2020-03-05 20:29:31 · 790 阅读 · 0 评论 -
基于观察者模式,写的多线程监听
主要用于并发不高的多线程监听public interface LifeCycleListener { void onEvent(ObservableRunnable.RunnableEvent event);}public abstract class ObservableRunnable implements Runnable{ final protected Li...原创 2020-02-25 21:11:33 · 189 阅读 · 0 评论 -
volatile 关键字的一些记录
volatile 关键字的一些记录public class VolatileTest { private volatile static int INIT_VALUE = 0; private final static int MAX_VALUE = 10; public static void main(String[] args) { new ...原创 2020-02-20 15:37:16 · 71 阅读 · 0 评论 -
ThreadGroup的使用及手写线程池
ThreadGroup的使用及详解ThreadGroup的使用及详解监听线程异常关闭如何拿到Thread线程中异常ThreadGroup线程池使用学习来源于b站 https://www.bilibili.com/video/av82219418自己仅作 java 多线程的记录,看视频主要还是看书看不下去了…然后推荐大家看看《JAVA并发编程实践》ThreadGroup的使用及详解监听线程...原创 2020-02-10 16:34:18 · 149 阅读 · 0 评论 -
java 多线程(锁(synchronized)的详解及应用)
java 多线程锁(synchronized)synchronized 关键字wait notify 实现线程通讯wait 和 sleep区别自己设计显示锁学习来源于b站 https://www.bilibili.com/video/av82219418自己仅作 java 多线程的记录,看视频主要还是看书看不下去了…然后推荐大家看看《JAVA并发编程实践》锁(synchronized)s...原创 2020-02-06 16:41:10 · 300 阅读 · 0 评论 -
java 多线程(关于Thread的讲解)
java 多线程Thread 介绍Thread 生命周期图Thread 构造方法介绍Daemon 线程join 方法线程结束暴力解决线程学习来源于b站 https://www.bilibili.com/video/av82219418自己仅作 java 多线程的记录,看视频主要还是看书看不下去了…然后推荐大家看看《JAVA并发编程实践》Thread 介绍Thread 生命周期图ja...原创 2020-02-05 16:13:20 · 1932 阅读 · 0 评论