随笔分类 -  JAVA基础 / 多线程

多线程基础知识学习
摘要:参考博客:蟹粉小笼包https://www.cnblogs.com/aalex/p/8480112.html [美团技术团队文章]('https://tech.meituan.com/2022/05/12/principles-and-practices-of-completablefuture.h 阅读全文
posted @ 2021-12-02 18:54 PerfectLi 阅读(145) 评论(0) 推荐(0) 编辑
摘要:首先,我们先了解一下什么是阻塞队列: 当队列满了时,队列会阻塞插入元素的线程,直到队列不满; 当队列为空时,获取元素的线程会等待队列变成非空。 常用到的方法 上面是对阻塞队列的简单了解,下面重点分析一下LinkedBlockingQueue。 源码分析 Node节点 可以看出是单向的链表结构 sta 阅读全文
posted @ 2020-09-24 18:15 PerfectLi 阅读(284) 评论(0) 推荐(0) 编辑
摘要:Semaphore主要用于对线程的控制,举个使用场景,几十个excel文件,数量千万。通过多线程几十个线程读取数据之后,要写入到数据库。但是数据库的连接数只有10。这个时候我们就要通过这个类对这些线程进行控制。因为数据写入时间过程,其他线程无法获取连接,出现无法获取数据库连接报错的情况。 主要的方法 阅读全文
posted @ 2020-09-24 10:35 PerfectLi 阅读(117) 评论(0) 推荐(0) 编辑
摘要:CyclicBarrier一般也是用于对多个线程任务进行同步执行。是多线程并发开发中重要的一个工具类; 分析一下源码 初始化 //用于控制栅栏进入的锁 private final ReentrantLock lock = new ReentrantLock(); //条件锁 private fina 阅读全文
posted @ 2020-09-23 17:17 PerfectLi 阅读(265) 评论(0) 推荐(0) 编辑
摘要:源码解析 内部锁结构 (共享锁) /** * 继承AQS,实现共享锁的获取和释放方法 */ private static final class Sync extends AbstractQueuedSynchronizer { Sync(int count) { setState(count); 阅读全文
posted @ 2020-09-22 08:02 PerfectLi 阅读(94) 评论(0) 推荐(0) 编辑
摘要:参考书:《Java并发编程艺术》 在学习这一块知识之前,可以先学习一下JMM相关的知识,回过来再看这个问题,就很好理解:https://www.cnblogs.com/perferect/p/13680158.html volatile 特性 可见性:对一个volatile变量的读,总能看到任意线程 阅读全文
posted @ 2020-09-21 00:21 PerfectLi 阅读(156) 评论(0) 推荐(0) 编辑
摘要:Executor框架 在实际开发工作中,或多或少我们都用到过多线程。一般很少使用 new Thread(){run()}.start()这种创建线程。一方面影响代码规范性,另外一方面,也是不方便多线程管理。当大量任务时,线程的创建销毁都会占用很多计算资源。这也是为什么使用线程池的原因。 在日常工作中 阅读全文
posted @ 2020-09-16 15:03 PerfectLi 阅读(246) 评论(0) 推荐(0) 编辑
摘要:FutureTask详解 作用:用于等待一个线程执行完毕后再执行另一个线程任务。一般用于Executors框架中,最常使用的是再ThreadPoolExecutor中,进行多线程任务; 注意: JDK1.8不在使用AQS进行线程管理; 取而代之的是通过CAS进行状态的切换,waiter线程节点由堆栈 阅读全文
posted @ 2020-09-14 18:19 PerfectLi 阅读(321) 评论(0) 推荐(0) 编辑
摘要:ThreadLocal在平时开发中是用的比较多的一个类,主要用于存储线程的数据。下面我对ThreadLocal进行一下总结; dreamcatcher-cx大佬对ThreadLocal的设计总结,写的比较深刻,很有帮助。 主要使用场景: 多数据源切换,记录当前线程访问的数据源 spring框架事务管 阅读全文
posted @ 2020-09-11 15:58 PerfectLi 阅读(270) 评论(7) 推荐(4) 编辑
摘要:LockSupport用来进行线程的阻塞和唤醒。在线程的一些操作中,经常能看到相关的使用。 park,unpark 和 wait,notify的区别 方法主体不同,wait和notify是Object的方法。 LockSupport 是针对线程进行阻塞和唤醒的操作 wait,notify和LockS 阅读全文
posted @ 2020-09-08 18:01 PerfectLi 阅读(176) 评论(0) 推荐(1) 编辑
摘要:同一时刻允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞。 所有晚于写操作的读操作都会进入等待状态。 数据结构 内部类提供了读写锁的子类 public class ReentrantReadWriteLock implements ReadWriteLock, java.io 阅读全文
posted @ 2020-09-08 16:40 PerfectLi 阅读(148) 评论(0) 推荐(0) 编辑
摘要:ReentrantLock也叫重入锁,可以对同一线程资源进行重复加锁。通过lock()方法可以显式的加锁,并且再次调用lock(),不会出现阻塞的情况 Sync子类提供锁的基本实现机制 非公平锁的获取 获取独占锁后,增加状态码 //加锁 final void lock() { if (compare 阅读全文
posted @ 2020-09-07 17:45 PerfectLi 阅读(185) 评论(0) 推荐(0) 编辑
摘要:参考书:《java并发编程艺术》 参考博客:https://www.cnblogs.com/micrari/p/6937995.html 源码分析:活在夢裡 大佬写的很详细,也是我看过的AQS源码分析最好的博客了。 我就自己学习和理解的过程做一下记录。 1 数据存储结构 AQS的数据存储,是通过内部 阅读全文
posted @ 2020-09-07 14:27 PerfectLi 阅读(198) 评论(0) 推荐(0) 编辑
摘要:CountDownLatch:概念是,允许一个或多个线程等待其他线程完成操作; 在线程基础知识中,学习过线程的join方法,当前线程阻塞等待join线程执行完毕才能执行; 测试代码如下: public static void main(String[] args) throws Interrupte 阅读全文
posted @ 2020-07-27 22:21 PerfectLi 阅读(112) 评论(0) 推荐(0) 编辑
摘要:参考书籍:《java并发编程艺术》 线程池的执行顺序 线程池的执行逻辑如下: 少于corePoolSize,新建线程任务 等于或多于corePoolSize,则放进BlockQueue存储 BlockQueue 存储满的时候,创建新的线程 超过maxmiumPoolSize,拒绝创建,并调用Reje 阅读全文
posted @ 2020-07-27 17:53 PerfectLi 阅读(142) 评论(0) 推荐(0) 编辑
摘要:**常见面试题:**创建一个线程的常用方法有哪些?Thread创建线程和Runnable创建线程有什么区别? 答案通常集中在,继承类和实现接口的差别上面; **如果深入问一些问题:**1.要执行的任务写在run()方法中,为什么要用start()方法启动?等等问题 简单的问题还是可以回答一哈子,但是 阅读全文
posted @ 2020-05-26 21:35 PerfectLi 阅读(292) 评论(0) 推荐(0) 编辑
摘要:1.基本概念 原子性是不可中断的最小操作;在Java中,一般通过加锁或者自旋CAS方式来确保原子操作; 而CAS(compareAnd swap)作为Java中常用的保证原子性的手段,JDK1.5之后就提供了相关的操作类,java.util.concurrent.atomic包中的工具类; CAS概 阅读全文
posted @ 2020-04-23 16:10 PerfectLi 阅读(195) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示