并发编程
不知为MUJI
站在树上的鸟从不害怕树枝断裂,因为它相信的不是树,而是翅膀。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【并发】锁的品种为什么辣么多
目录1.悲观锁 VS 乐观锁2.公平锁 VS 非公平锁3.独占锁 VS 共享锁4.可重入锁5.自旋锁1.悲观锁 VS 乐观锁互斥同步属于一种悲观的并发策略:其总是认为只要不去做正确的同步措施(例如加锁),那就肯定会出现问题,无论共享的数据是否真的会出现竞争,它都会进行加锁,这会导致用户态到核心态转换、维护锁计数器和检查是否有被阻塞的线程需要被唤醒等开销。基于冲...原创 2020-04-07 16:01:53 · 155 阅读 · 0 评论 -
【并发编程】一张图彻底理解了ReentrantLock和AQS
类比synchronized synchronized ReentrantLock 相同点 可重入 比如一个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的 不同点 JVM实现 JDK API (java.util.concurrent) ...原创 2020-04-01 13:53:08 · 332 阅读 · 0 评论 -
【JDK1.6】HashMap死循环形成原因
目录1.扩容形成环路2.get(key)操作死循环1.扩容形成环路在put元素超过负载阈值时会触发HashMap的扩容resize操作,一个桶的链表会重新散列到新表中, /** * put 插入元素之后,负载超过阈值,触发resize方法扩容 */ void addEntry(int hash, K key, V value, int bu...原创 2020-03-27 17:26:39 · 777 阅读 · 0 评论 -
【JDK1.8源码】ConcurrentHashMap并发容器图解
1.类图对比HashMapConcurrentHashMap(CHM) HashMap(HM) 2.并发实现2.1 内部对象安全发布数据结构与HashMap对比可以发现table是大体相似的,而entrySet等返回的都是View的视图包装类。防止直接发布内部容器,被意外修改,导致Map的不变式约束被破坏,数据不一致不完整。读写操作都做了重写,当对ent...原创 2020-03-24 21:05:38 · 374 阅读 · 0 评论 -
【并发】为什么HashMap是线程不安全的?
0.背景经常会看到说HashMap是线程不安全的,ConcurrentHashMap是线程安全的等等说法,不禁有个疑问,什么是线程安全?什么样的类是线程安全的?1.什么是线程安全性(what)线程安全定义,最核心是正确性,正确性:多个线程访问某个类,不管怎么调度这些线程,其代码中不需要额外的同步或协同(synchronized),这个类依然有正确的行为。线程安全类封装了必要的同...原创 2020-03-23 13:43:01 · 3530 阅读 · 0 评论 -
【并发编程】Executor线程池框架-图文源码详解
目录0框架类图1. Executors工具类2 ThreadPoolExecutor2.1API常用方法2.1.1 构造方法2.1.2 核心方法execute(Runnable r)2.1.3 addWorker创建工作线程2.2组件解析2.2.1 worker2.2.2 ThreadFactory2.2.3BlockingQueue0框...原创 2020-03-19 18:29:26 · 398 阅读 · 0 评论 -
【并发编程】线程生命周期
状态流转总图0.新建状态NewThread类 实现了Runnable接口 run() Runnable接口 run(),通过Thread类或线程池来使用 Callable接口 作为FutureTask构造方法参数使用 call方法,有返回值,且可以抛出异常 call方法实际是在Runnable的run方法中被执行 1.就绪状态Runnable调用线程...原创 2020-03-18 15:07:48 · 270 阅读 · 0 评论 -
Java并发编程
0.背景1.为什么会有并发编程的概念呢?因为硬件的发展,多核CPU的出现,为了更充分地利用多核CPU,可以让任务在多个核上并行地计算,以提升程序的计算效率。2.应用场景:如GUI程序,提升响应用户的速度;如服务端同时响应多个客户端请求,提升吞吐量和响应。异步事件的简化处理3.引入并发编程导致了哪些问题?(1)线程安全问题由于多个线程并发地访问线程共享的状态,...原创 2020-01-21 16:25:48 · 267 阅读 · 0 评论 -
【多线程】线程同步之wait 和 notify
需求leetcode1116. 打印零与奇偶数奇偶交替打印给出一个正整数n,打印出0102.....0n的序列3个线程共享对象ZeroEvenOdd,t1 调用其zero();t2 调用odd();t3 调用even()方法解题思路Wait-notify模型进行三个线程的同步,两个变量,一个是序列当前数字(包含0),还有一个是递增数字3个线程都有着个字的打印条件,如果不...原创 2020-01-08 08:36:51 · 634 阅读 · 0 评论 -
多线程之取消任务(中断线程)
Future接口public interface Future<V> { /** * 尝试取消执行此任务。 * mayInterruptIfRunning {@code true}如果执行此操作的线程任务应该中断; 否则,允许进行中任务去完成 */ boolean cancel(boolean mayInterruptIfRunni...原创 2019-04-18 17:47:59 · 995 阅读 · 0 评论 -
Java线程安全-monitor锁
目录1、为什么要用锁?2、锁实现的基本原理2.1、volatile2.2、synchronized2.2.1 synchronized实现原理2.2.2 synchronized具体实现2.3、CAS3、锁的使用用例3.1、ConcurrentHashMap的实现原理及使用1、为什么要用锁?锁-是为了解决并发操作引起的脏读、数据不一致的问题。2、锁实...转载 2019-04-10 09:19:12 · 2676 阅读 · 2 评论 -
阻塞队列-DelayQueue实现周期任务
周期任务ScheduledExecutorServiceAPIScheduledExecutorService是已有的周期任务 实现,提供了ScheduledExecutorService schedulePool= Executors.newScheduledThreadPool(2);// 延迟5s后只执行一次schedulePool.schedule(task,5,TimeUni...原创 2019-04-16 10:19:34 · 494 阅读 · 0 评论 -
java并发编程概要
原创 2019-04-09 11:38:35 · 124 阅读 · 0 评论 -
Executor框架-常见使用
ExecutorsExecutors是类似Collections和Arrays一样的工具类,包含了很多静态工厂方法来生产常用线程池。常用静态工厂方法:// 创建一个指定大小的线程池,返回ThreadPoolExecutor的实现public static ExecutorService newFixedThreadPool(int nThreads);// 创建一个按需创建、回收线程的线...原创 2019-04-12 11:08:20 · 775 阅读 · 0 评论 -
线程池Executor框架-源码解析
1.ThreadPoolExecutorExecutor框架最核心实现类是ThreadPoolExecutor。1.1 构造方法public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, lo...原创 2019-04-10 18:20:44 · 216 阅读 · 0 评论 -
【多线程】线程协作之wait和notify
简介1.wait方法用于让线程等待一个条件,当条件满足的时候才开始执行如 消费者执行的条件是队列非空,所以消费者线程需要等到非空 才能执行 /** * wait通用使用模式 * @param action */ private void waitDemo(Runnable action) { synchronized (lock) {//...原创 2019-04-04 14:31:44 · 127 阅读 · 0 评论 -
【多线程】CountDownLatch应用
比喻这个程序就像是5个选手在赛跑1.5个选手都需要在跑道上准备2.裁判需要在选手准备完毕后开枪喊开始3.等5个选手都跑到终点 比赛结束package concurrency;import java.util.concurrent.CountDownLatch;import java.util.concurrent.Executor;import java.util.concurr...原创 2019-04-04 11:13:42 · 227 阅读 · 0 评论 -
【并发】生产者消费者模型
生产者消费者模型使用内部条件队列 wait()和notify()方法@ThreadSafepublic class BoundedBuffer<V> extends BaseBoundedBuffer<V> { // 条件谓词: not-full (!isFull()) // 条件谓词: not-empty (!isEmpty()) public BoundedBuffer原创 2019-12-06 16:38:04 · 162 阅读 · 0 评论
分享