随笔分类 - 并发编程
关于并发多线程这一块的技术站
摘要:线程池 什么是线程池? 线程池,thread pool,是一种线程使用模式 为什么要使用线程池? 1:降低资源的消耗,降低线程的创建和销毁的资源消耗 2:提高响应速度,假设线程的创建时间为T1,执行时间为T2,销毁时间为T3,如果是自己创建线程必然会经历,这三个时间,那么如果创建+销毁>执行,就会有
阅读全文
摘要:什么是阻塞队列 概念 当队列满的时候,插入元素的线程被阻塞,直到队列不满 队列为空的时候,获取元素的线程被阻塞,直到队列不为空 生产者消费者模式也是阻塞队列的一种体现 常用阻塞队列 ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列 LinkedBlockingQueue:一个由
阅读全文
摘要:为什么要用ConcurrentHashMap? 说到HashMap,应该都不陌生,但是说到ConcurrentHashMap,新手用过的应该比较少 HashMap本身是不适合多线程的,是没有并发安全保证的,为什么呢?因为HashMap的put操作会引起死循环,HashMap里面的Entry链表会产生
阅读全文
摘要:千呼万唤始出来,终于写到AQS这个一章了,其实为了写这一章,前面也是做了很多的铺垫,比如之前的 深度理解volatile关键字 线程之间的协作(等待通知模式) JUC 常用4大并发工具类 CAS 原子操作 显示锁 了解LockSupport工具类 这些文章其实都是为了让大家理解AQS而写的铺垫,就像
阅读全文
摘要:介绍: 在网上也没有找到太多的东西,大概说了一下,这个工具类的所有方法都是静态的,底层采用UNSAFE直接操作的内存,可以实现线程的阻塞和唤醒 可以看到他的park方法调用的是UNSAFE的park方法 而UNSAFE的park方法是一个native方法,调用的C的类库了,没办法继续看下去了,因为我
阅读全文
摘要:之前在写显示锁的是后,在显示锁的接口中,提到了new Condition这个方法,这个方法会返回一个Condition对象 简单介绍一下 Condition接口: 任意一个Java对象,都拥有一组监视器方法(定义在java.lang.Object上),主要包括wait()、wait(long tim
阅读全文
摘要:排它锁: 之前的Synchronized和ReentrantLock都是排他锁,默认只有一个线程可以占用 读写锁: 读写锁,同一时刻允许多个读线程同时访问,但是写线程访问的时候,所有的读和写都被阻塞,最适宜与读多写少的情况 通过解释,我们可以知道读写锁,最常用的就是读多写少的场景,读写锁相比于普通的
阅读全文
摘要:其实好多人,在面试的时候都被问到过,可能是因为没有碰见过,在这里说一下吧,也当是为大家填一个坑 所谓锁的公平与非公平: 如果在时间上,先对锁进行获取的请求,一定先被满足,这个锁就是公平的,不满足,就是非公平的,就类似先到先得,就是公平的,有人插队没人管,就是非公平的 效率对比: 非公平锁的效率,是普
阅读全文
摘要:本来打算写设计模式的,在周六日用了两天的时间全部看了一遍,但是写了一篇之后,发现,写的没有网上的好,感觉大家可能看不懂,所以打算继续写并发编程 设计模式,就给大家推荐一下菜鸟教程的吧,我看了一下,将的比较统一,都很不错 链接:https://www.runoob.com/design-pattern
阅读全文
摘要:理会CAS和CAS: 有时候面试官面试问你的时候,会问,谈谈你对CAS的理解,这时应该有很多人,就会比较懵,当然,我也会比较懵,当然我和很多人的懵不同,很多人可能,并不知道CAS是一个什么东西,而在我看来我是不知道他问的是那个CAS 我一般会问面试官,问他问的CAS是"原子操作",还是"单点登录"
阅读全文
摘要:Callable接口: Callable,新启线程的一种方式,返回结果并且可能抛出异常的任务,在前面的新启线程的文章中用过,但是没有具体讲解 优点: 可以获取线程的执行结果,也称为返回值 通过与Future的结合,可以实现利用Future来跟踪异步计算的结果 Runnable和Callable的区别
阅读全文
摘要:什么是JUC? JUC就是java.util.concurrent包,这个包俗称JUC,里面都是解决并发问题的一些东西 该包的位置位于java下面的rt.jar包下面 4大常用并发工具类: CountDownLatch CyclicBarrier Semaphore ExChanger CountD
阅读全文
摘要:Fork Join 体现了分而治之 什么是分而治之? 规模为N的问题,如果N<阈值,直接解决,N>阈值,将N分解为K个小规模子问题,子问题互相对立,与原问题形式相同,将子问题的解合并得到原问题的解 Fork Join 框架: 就是在必要的情况下,将一个大任务,进行拆分(fork)成若干了小任务(拆到
阅读全文
摘要:join方法 线程A执行了线程B的join方法,,线程A必须要等线程B执行完成后,线程A才能继续执行 感觉像是插队[捂脸] package org.dance.day1; import org.dance.tools.SleepTools; /** * join方法的使用 */ public cla
阅读全文
摘要:等待超时模式: 假设等待时间为 T ,在当前时间NOW + T 之后就会超时 等待超时模式伪代码: /** * 等待的时间 */ long remain = T; /** * 超时时间 */ long overtime = now + T; while (result 不满足条件 && remain
阅读全文
摘要:等待和通知 等待和通知的标准范式 等待方: 1:获取对象的锁 2:在循环中判断条件是否满足,不满足调用wait方法继续阻塞,为啥要要循环中判断呢?因为该线程被唤醒之后可能条件依旧不满足 3:条件满足,执行业务逻辑 通知方: 1:获取对象的锁 2:改变相关条件 3:通知所有等待在对象的线程 都是属于O
阅读全文
摘要:package org.dance.day1; import org.dance.tools.SleepTools; /** * ThreadLocal 的使用 * @author ZYGisComputer */ public class UseThreadLocal { /** * 声明Thre
阅读全文
摘要:最轻量的同步机制 获取被volatile修饰的变量的时候,每次都要从主内存中获取 设置被volatile修饰的变量的时候,每次都要刷回主内存当中 当其他线程调用的时候,会将自己线程当中保存的变量值置为无效,然后重新重主内存获取 在读取和写入到主内存的时候,不会进行加锁,所以称之为最轻量的同步机制 v
阅读全文
摘要:理论: 多个线程之间共享资源就会发成数据上的冲突,我们往往会使用Synchronized关键字来实现锁 这个锁要不加在方法上,要么以同步块的形式来使用,它最大作用就是确保多个线程在同一时刻,只能有一个线程处于方法和同步块之中,这样它就保证了线程对变量的可见性和排他性 因为这个Synchronized
阅读全文
摘要:线程常用方法和线程的状态 线程的生命周期图,及其调用线程的方法会改变的状态 调用run和start()的区别 package org.dance.day1; import org.dance.tools.SleepTools; /** * 线程调用 run 和 start 方法的区别 * @auth
阅读全文