随笔分类 -  并发编程专题

摘要:HashMap Java7,HashMap 会产生死锁; 数据模型:数组 + 链表 Java8,HashMap 不会产生死锁,同时put有可能会产生数据丢失的情况;数据模型:数组 + 链表 + 红黑树 JAVA7 HashMap死锁的原因:hashMap在多线程的场景下,扩容期间存在节点位置互换指针 阅读全文
posted @ 2020-06-30 00:02 风止雨歇 阅读(671) 评论(0) 推荐(0) 编辑
摘要:ScheduledThreadPoolExecutor 提交的任务按照执行的时间排序放入到 DelayQueue 队列中。 DelayQueue内部封装了一个PriorityQueue,它会根据time的先后时间排序(time小的排在前面),若time相同则根据sequenceNumber排序( s 阅读全文
posted @ 2020-06-29 23:12 风止雨歇 阅读(13434) 评论(0) 推荐(0) 编辑
摘要:一、概念 Fork/Join 框架是 Java7 提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。Fork 就是把一个大任务切分为若干子任务并行的执行,Join 就是合并这些子任务的执行结果,最后得到这个大任务的结果。 Fork/ 阅读全文
posted @ 2020-06-28 23:32 风止雨歇 阅读(432) 评论(0) 推荐(0) 编辑
摘要:1. 线程的实现方式 讲线程池之前我们先看一下线程的实现方式: Thread,Runnable,Callable // 实现Runnable接口的类将被Thread执行,表示一个基本的任务 public interface Runnable { // run方法就是它所有的内容,就是实际执行的任务 阅读全文
posted @ 2020-06-22 22:10 风止雨歇 阅读(285) 评论(0) 推荐(0) 编辑
摘要:一、BlockingQueued BlockingQueued 队列使用 ReentrantLock 和 Condition(AQS实现)来实现的。Condition 只能用于独占模式。 条件队列中的节点永远不会被唤醒,一直阻塞者;要想唤醒,则需要把该节点放到CLH队列中,放入到CLH队列中才有机会 阅读全文
posted @ 2020-06-20 17:26 风止雨歇 阅读(1106) 评论(0) 推荐(0) 编辑
摘要:1、Automic Java中 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。 所谓原子类说简单点就是具有原子/原子操作特征的类。Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多 阅读全文
posted @ 2020-06-17 23:17 风止雨歇 阅读(292) 评论(0) 推荐(0) 编辑
摘要:1、Semaphore Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源,它是共享锁的方式。 Semaphore可以用于做流量控制,特别是公用资源有限的应用场景。 1.1 构造方法 public Semaphore(int permits 阅读全文
posted @ 2020-06-12 23:35 风止雨歇 阅读(223) 评论(0) 推荐(0) 编辑
摘要:一、AQS的概念及使用 Java并发编程核心在于 java.concurrent.util 包而juc当中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列、条件队列、独占获取、共享获取等,而这个行为的抽象就是基于 AbstractQueuedSynchronizer 简称AQS,AQS定义了 阅读全文
posted @ 2020-06-11 21:58 风止雨歇 阅读(4662) 评论(0) 推荐(2) 编辑
摘要:多线程编程中,有可能会出现多个线程同时访问同一个共享、可变资源的情况;这种资源可能是:对象、变量、文件等。 由于线程执行的过程是不可控的,所以需要采用同步机制来协同对对象可变状态的访问,那么我们怎么解决线程并发安全问题? 实际上,所有的并发模式在解决线程安全问题时,采用的方案都是 序列化访问临界资源 阅读全文
posted @ 2020-06-02 23:18 风止雨歇 阅读(6385) 评论(0) 推荐(0) 编辑
摘要:一、线程 1、什么是线程? 进程是系统分配资源的基本单位,线程是调度CPU的基本单位,一个进程至少包含一个执行线程,线程寄生在进程当中。每个线程都有一个程序计数器(记录要执行的下一条指令),一组寄存器(保存当前线程的工作变量),堆栈(记录执行历史,其中每一帧保存了一个已经调用但未返回的过程)。 JV 阅读全文
posted @ 2020-01-01 23:39 风止雨歇 阅读(451) 评论(0) 推荐(0) 编辑
摘要:CPU多核缓存架构 1、多线程环境下存在的问题 在多处理器系统中,每个处理器都有自己的高速缓存,而它们又共享同一主内存(RAM)。基于高速缓存的存储交互很好地解决了处理器与内存的速度矛盾,但是也引入了新的问题:缓存一致性(CacheCoherence)。 若有两个线程 T1 和 T2 都去计算 x 阅读全文
posted @ 2020-01-01 22:23 风止雨歇 阅读(962) 评论(0) 推荐(0) 编辑
摘要:execute()内部实现 1.首次通过workCountof()获知当前线程池中的线程数, 如果小于corePoolSize, 就通过addWorker()创建线程并执行该任务; 否则,将该任务放入阻塞队列; 2. 如果能成功将任务放入阻塞队列中, 如果当前线程池是非RUNNING状态,则将该任务 阅读全文
posted @ 2018-11-11 19:27 风止雨歇 阅读(520) 评论(0) 推荐(0) 编辑
摘要:Java 5+中的Executor接口定义一个执行线程的工具。它的子类型即线程池接口是ExecutorService。要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,因此在工具类Executors面提供了一些静态工厂方法,生成一些常用的线程池,如下所示: - newCache 阅读全文
posted @ 2018-11-11 00:11 风止雨歇 阅读(2458) 评论(0) 推荐(0) 编辑
摘要:1、线程、多线程与线程池总结:https://www.jianshu.com/p/b8197dd2934c 2、java中的多线程:http://www.importnew.com/21089.html 一、JAVA 线程实现/创建方式 启动线程的唯一方法就是通过 Thread 类的 start() 阅读全文
posted @ 2018-11-10 16:47 风止雨歇 阅读(141) 评论(0) 推荐(0) 编辑

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