01 2019 档案
摘要:从名字上看,『ThreadLocal』可能会给你一种本地线程的概念印象,可能会让你联想到它是一个特殊的线程。 但实际上,『ThreadLocal』却营造了一种「线程本地变量」的概念,也就是说,同一个变量在每个线程的内部,都有一份副本,且相互之间具有不同的取值。 这样的设计具有怎样的应用场景呢?是怎么
阅读全文
摘要:现代的应用程序早已不是以前的那些由简单的增删改查拼凑而成的程序了,高复杂性早已是标配,而任务的定时调度与执行也是对程序的基本要求了。 很多业务需求的实现都离不开定时任务,例如,每月一号,移动将清空你上月未用完流量,重置套餐流量,以及备忘录提醒、闹钟等功能。 Java 系统中主要有三种方式来实现定时任
阅读全文
摘要:之前的两篇文章中,我们介绍了异步编程,也介绍了线程池的基本概念。也说了,线程池的实现天生也实现了异步任务,允许直接向线程池中进行任务的提交与结果获取。 但是,我们始终没有去深入的了解下,异步任务框架对于任务执行的进度是如何监控的,任务执行的结果该如何获取。 那么,本篇文章就来详细地探讨下异步框架中,
阅读全文
摘要:线程池,是一种线程的使用模式,它为了降低线程使用中频繁的创建和销毁所带来的资源消耗与代价。 通过创建一定数量的线程,让他们时刻准备就绪等待新任务的到达,而任务执行结束之后再重新回来继续待命。 这就是线程池最核心的设计思路,「 复用线程,平摊线程的创建与销毁的开销代价 」。 相比于来一个任务创建一个线
阅读全文
摘要:异步编程是一种对 CPU 资源更高效的编程方式,也是提高系统吞吐量的一个非常不错的选择。很多人会认为所谓的异步不就是多线程吗? 但实际上这句话只能说对一半,没错,异步是通过多线程来实现的,但我们 Java 中的异步编程却绝不仅仅只是多线程,它还包括对任务执行状态的监控、随时可以选择性的中断任务的执行
阅读全文
摘要:我们之前介绍 synchronized 关键字语义的时候说过,synchronized 虽然不需要我们手动的加锁和释放锁了,但不代表他没有用到锁。同时,我们说每个对象本身结构中也内置了阻塞队列,线程持有器,锁重入计数器等字段。 所以,与其说是 synchronized 实现了「自动化的锁机制」,不如
阅读全文
摘要:上一篇文章我们介绍了一个显式锁,ReentrantLock ,了解到它是一个『独占式』锁,简而言之就是, 我拿到锁以后,不管我是读或是写操作,其他人都不能和我抢,都得等着。 因而在某些读操作远大于写操作的场景之下,即便我只是读数据也不得不排队一个一个来,于是有人提出了一个『读写锁』的概念。 『读写锁
阅读全文