Java并发编程
文章平均质量分 92
不定时更新
不懂的浪漫
这个作者很懒,什么都没留下…
展开
-
Java 中常见的阻塞队列有哪些?
Java 中常见的阻塞队列有哪些?文章目录Java 中常见的阻塞队列有哪些?前言项目环境1.ArrayBlockingQueue2.LinkedBlockingQueue3.SynchronousQueue4.PriorityBlockingQueue5.DelayQueue6.参考前言BlockingQueue 接口的实现类都在 J.U.C (java.util.concurrent)包中,本章将介绍以下 5 种常见的实现类ArrayBlockingQueueLinkedBlockingQue原创 2020-07-05 18:17:43 · 1694 阅读 · 1 评论 -
Java 阻塞队列中的常用方法及区别
Java 阻塞队列中的常用方法及区别文章目录Java 阻塞队列中的常用方法及区别前言1.第一组方法1.1 add 方法1.2 remove 方法1.3 element 方法2.第二组方法2.1 offer 方法2.2 poll 方法2.3 peek 方法3.第三组方法3.1 put 方法3.2 take 方法9.总结10.参考前言在阻塞队列中有很多方法,它们的功能都非常相似,所以非常有必要对这些类似的方法进行辨析,本章采用分类的方式对阻塞队列中常见的方法进行讨论。BlockingQueue 中最常用原创 2020-07-04 11:56:31 · 1386 阅读 · 0 评论 -
HashMap 为什么线程不安全?
HashMap 为什么线程不安全?文章目录HashMap 为什么线程不安全?前言项目环境1.put 方法中的 ++modCount 问题2.扩容期间取值不准确3.同时 put 碰撞导致数据丢失4.可见性问题5.扩容头插法可能导致的循环链表问题6.总结7.参考前言本文从以下几个方面来讨论 HashMap 为什么是线程不安全的put 方法中的 modCount++ 问题扩容期间取值不准确同时 put 碰撞导致数据丢失可见性问题扩容头插法可能导致的循环链表问题(jdk 1.8 以前版本)jd原创 2020-07-01 09:54:58 · 992 阅读 · 0 评论 -
Java面试题:多个线程交替执行
Java面试题:多个线程交替执行文章目录Java面试题:多个线程交替执行前言1.Condition 版本2.公平锁3.如何解决线程打印顺序的问题前言最近在一些技术群里看到有很多小伙伴面试的时候碰到这个多线程的笔试题,实现两个线程交替打印,或者是实现多个线程的交替打印这种类似的题目。本文提供三种解题思路和实现利用 Condition 类实现利用公平锁实现超过 2 个线程,利用队列来保证线程执行的顺序1.Condition 版本缺陷是超过 2 个线程之后无法保证执行的顺序public原创 2020-06-30 11:17:57 · 4836 阅读 · 0 评论 -
线程池的线程复用原理
线程池的线程复用原理文章目录线程池的线程复用原理前言项目环境1.什么是线程复用?2.线程复用的原理3.线程池执行流程3.1 流程图3.2 线程创建的流程3.3 ThreadPoolExecutor#execute 源码分析3.4 逐行分析4.线程复用源码分析5.参考前言在 第十一篇:线程池使用及源码分析 中有简单介绍过线程复用的基本原理,本章会进行更为详细的讨论。项目环境jdk 1.8github 地址:https://github.com/huajiexiewenfeng/java-conc原创 2020-06-29 09:36:29 · 7427 阅读 · 2 评论 -
关闭线程池 shutdown 和 shutdownNow 的区别
关闭线程池 shutdown 和 shutdownNow 的区别文章目录关闭线程池 shutdown 和 shutdownNow 的区别前言项目环境1.线程池示例2.shutdown3.isShutdown4.isTerminated5.awaitTermination6.shutdownNow7.shutdown 和 shutdownNow 的区别?8.参考前言本章分为两个议题如何正确关闭线程池shutdown 和 shutdownNow 的区别项目环境jdk 1.8github 地原创 2020-06-29 09:31:22 · 5051 阅读 · 1 评论 -
线程池合适的线程数量是多少?
线程池合适的线程数量是多少?文章目录线程池合适的线程数量是多少?前言1.CPU密集型2.IO密集型3.通用公式4.结论5.参考前言本章主要讨论线程池合适的线程数量是多少,以及 CPU 核心数和线程数的关系。我们调整线程池中的线程数量的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能。在实际工作中,我们需要根据任务类型的不同选择对应的策略。1.CPU密集型第一种是 CPU 密集型任务,比如加密、解密、压缩、计算等一系列需要大量耗费 CPU 资源的任务。最佳线程原创 2020-06-28 12:00:33 · 14610 阅读 · 6 评论 -
Java 线程池的各个参数的含义
Java 线程池的各个参数的含义文章目录Java 线程池的各个参数的含义1.线程池参数2.线程池执行流程2.1 流程图2.2 线程创建的流程2.3 小结3.核心线程数和最大线程数4.keepAliveTime+时间单位5.ThreadFactory6.workQueue7.Handler8.参考1.线程池参数参数名含义corePoolSize核心线程数maximumPoolSize最大线程数keepAliveTime+时间单位 unit空闲线程的存活时间Th原创 2020-06-25 05:59:26 · 2024 阅读 · 0 评论 -
线程池常用的阻塞队列有哪些?
线程池常用的阻塞队列有哪些?文章目录线程池常用的阻塞队列有哪些?1.线程池的内部结构2.阻塞队列3.LinkedBlockingQueue4.SynchronousQueue5.DelayedWorkQueue6.参考1.线程池的内部结构线程池内部由四部分组成第一部分是线程池管理器,主要负责管理线程池的创建、销毁、添加任务等管理操作。第二部分是工作线程,它又分为核心工作线程和非核心工作线程。第三部分是任务队列,作为一种缓冲机制,会将超过核心线程数的任务放到任务队列中,等待执行;由于原创 2020-06-25 05:51:27 · 7428 阅读 · 0 评论 -
线程池的4种拒绝策略
线程池的4种拒绝策略文章目录线程池的4种拒绝策略1.拒绝时机2.拒绝策略2.1 核心接口2.2 内建实现2.2.1 CallerRunsPolicy2.2.2 AbortPolicy2.2.3 DiscardPolicy2.2.4 DiscardOldestPolicy3.参考1.拒绝时机线程池会在以下两种情况下会拒绝新提交的任务当我们调用 shutdown 等方法关闭线程池的时候,如果此时继续向线程池提交任务,就会被拒绝当任务队列(workQueue)已满,而且线程达到最大线程数(maximu原创 2020-06-25 05:48:41 · 4061 阅读 · 0 评论 -
Java并发编程|第十一篇:线程池使用及源码分析
Java线程池文章目录Java线程池1.线程池的使用场景2.Java中的线程池线程池的核心参数Executors类APIFixedThreadPool分析CachedThreadPool3.源码分析ThreadPoolExecutor#executectl 核心变量线程池状态变化addWorker()线程复用Workerstate状态addWorkerFailed()tryTerminate()...原创 2020-01-03 15:23:54 · 425 阅读 · 0 评论 -
Java并发编程|第十篇:ConcurrentHashMap源码分析
Java并发编程|第十篇:ConcurrentHashMap源码分析文章目录Java并发编程|第十篇:ConcurrentHashMap源码分析前言1.介绍2.例子3.JDK1.7 和 JDK1.8 的区别JDK1.7JDK1.84.源码分析put方法初始化阶段initTable()sizeCtl值的含义tabAt()casTabAt()put方法集合大小计算阶段addCount()Counte...原创 2019-12-27 10:59:09 · 390 阅读 · 1 评论 -
Java并发编程|第九篇:Semaphore 信号量
Java并发编程|第九篇:Semaphore 信号量文章目录Java并发编程|第九篇:Semaphore 信号量1.介绍2.例子3.源码分析构造方法acquire()acquireSharedInterruptibly()区别在于其中几个方法实现方式Sync类非公平NonfairSyncnonfairTryAcquireShared()公平FairSyncrelease()总结4.参考1.介绍...原创 2019-12-19 15:52:05 · 155 阅读 · 0 评论 -
Java并发编程|第八篇:CountDownLatch
Java并发编程|第八篇:CountDownLatch文章目录Java并发编程|第八篇:CountDownLatch1.介绍2.例子3.源码分析构造方法await()acquireSharedInterruptibly()tryAcquireShared()doAcquireSharedInterruptibly()shouldParkAfterFailedAcquire()&parkA...原创 2019-12-19 09:07:17 · 190 阅读 · 0 评论 -
Java并发编程|第七篇:Condition
Java并发编程|第七篇:Condition文章目录Java并发编程|第七篇:Condition1.例子wait/notifyConditionConditionWaitConditionNotifyCondtionDemo2.源码分析await()addConditionWaiter()fullyRelease()tryRelease()isOnSyncQueue()condition.sig...原创 2019-12-18 09:25:00 · 221 阅读 · 0 评论 -
Java并发编程|第六篇:ReentrantLock 重入锁
Java并发编程|第六篇:ReentrantLock 重入锁文章目录Java并发编程|第六篇:ReentrantLock 重入锁前言1.类图分析2.预备知识2.1 什么是AQS2.2 CAS实现原理3.ReentrantLock 源码分析3.1 加锁流程lock.lock() 时序图lock()入口acquire()tryAcquire()addWaiter ()enq(node)Node 的一...原创 2019-12-13 17:03:21 · 197 阅读 · 0 评论 -
Java并发编程|第二篇:线程生命周期
文章目录1.线程的状态2.线程生命周期3.状态测试代码4.线程终止4.1 线程执行完成4.2 interrupt5.线程复位5.1interrupted5.1抛出异常6.参考1.线程的状态jdk源码中Thread类中有个State的枚举类,表示线程运行中的所有状态NEWThread state for a thread which has not yet started.创建线程...原创 2019-07-13 15:17:12 · 271 阅读 · 0 评论 -
Java并发编程|第三篇:synchronized锁
1.锁的应用场景先来看一个例子,线程A、线程B或者多个线程同时操作count,进行++操作,结果有可能和预期不同测试代码在正常情况下,以下代码的结果应该为1000,循环1000次,每次+1;public class AtomicDemo { private static int count = 0; public static void incr() { ...原创 2019-07-16 19:36:32 · 259 阅读 · 0 评论 -
Java并发编程|第四篇:synchronized锁升级
文章目录前言对象内存布局Mark Word锁优化场景无锁-->偏向锁线程1执行步骤:线程2执行步骤:无锁->轻量级锁->重量级锁线程1执行步骤:线程2执行步骤:前言根据上一篇文章Java并发编程|第三篇:synchronized锁,其实发现,synchronized(lock)的作用范围和lock锁的对象有关我们先来看看对象在内存中的内存布局对象内存布局对象头第...原创 2019-08-25 17:28:44 · 483 阅读 · 0 评论 -
Java并发编程|第五篇:可见性,java内存模型
Java并发编程第五篇:可见性,java内存模型1.可见性在多线程环境下,读和写发生在不同的线程中的时候,可能会出现读线程不能及时的读取到其他线程写入的最新的值。这就是所谓的可见性.测试代码:/** * 可见性测试 */public class NoVisbility { private static boolean ready; private static ...原创 2019-09-04 09:39:55 · 529 阅读 · 0 评论 -
Java并发编程|第一篇:线程初体验
文章目录1. java中如何使用线程2. 线程作用3.Thread类本质上也是实现Runnable接口4.实际例子4.1预设场景:request请求处理4.2 代码4.2.1 request4.2.2 IRequestProcessor4.2.3 PrevProcessor4.2.4 PrintProcessor4.2.5 SaveProcessor4.2.6 测试调用5.参考1. java中如...原创 2019-07-13 10:01:14 · 278 阅读 · 0 评论