07 2019 档案
摘要:本文主要内容
1. 什么是线程池
2. 线程池实现原理
3. 线程池中常见的各种队列
4. 自定义线程创建的工厂
5. 常见的饱和策略
6. 自定义饱和策略
7. 线程池中两种关闭方法有何不同
8. 扩展线程池
9. 合理地配置线程池
10. 线程池中线程数量的配置
阅读全文
摘要:1. 第1天:必须知道的几个概念 2. 第2天:并发级别 3. 第3天:有关并行的两个重要定律 4. 第4天:JMM相关的一些概念 5. 第5天:深入理解进程和线程 6. 第6天:线程的基本操作 7. 第7天:volatile与Java内存模型 8. 第8天:线程组 9. 第9天:用户线程和守护线程
阅读全文
摘要:这是java高并发系列第17篇。 本文主要内容: 1. 介绍CyclicBarrier 2. 6个示例介绍CyclicBarrier的使用 3. 对比CyclicBarrier和CountDownLatch CyclicBarrier简介 CyclicBarrier通常称为循环屏障。它和CountD
阅读全文
摘要:这是java高并发系列第16篇文章。 本篇内容 1. 介绍CountDownLatch及使用场景 2. 提供几个示例介绍CountDownLatch的使用 3. 手写一个并行处理任务的工具类 假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一
阅读全文
摘要:这是java高并发系列第15篇文章 Semaphore(信号量)为多线程协作提供了更为强大的控制方法,前面的文章中我们学了synchronized和重入锁ReentrantLock,这2种锁一次都只能允许一个线程访问一个资源,而信号量可以控制有多少个线程可以 同时访问 特定的资源。 Semaphor
阅读全文
摘要:这是java高并发系列第14篇文章。 本文主要内容: 1. 讲解3种让线程等待和唤醒的方法,每种方法配合具体的示例 2. 介绍LockSupport主要用法 3. 对比3种方式,了解他们之间的区别 LockSupport 位于 java.util.concurrent ( 简称juc )包中,算是j
阅读全文
摘要:本文目标: 1. synchronized中实现线程等待和唤醒 2. Condition简介及常用方法介绍及相关示例 3. 使用Condition实现生产者消费者 4. 使用Condition实现同步阻塞队列 Object对象中的wait(),notify()方法,用于线程等待和唤醒等待中的线程,大
阅读全文
摘要:java高并发系列 第12天JUC:ReentrantLock重入锁 本篇文章开始将juc中常用的一些类,估计会有十来篇。 synchronized的局限性 synchronized是java内置的关键字,它提供了一种独占的加锁方式。synchronized的获取和释放锁由jvm实现,用户不需要显示
阅读全文
摘要:java高并发系列第11篇文章。 本文主要探讨一下中断线程的几种方式。 通过一个变量控制线程中断 代码: 代码中启动了一个线程,线程的run方法中有个死循环,内部通过exit变量的值来控制是否退出。 让主线程休眠3秒,此处为什么使用TimeUnit?TimeUnit使用更方便一些,能够很清晰的控制休
阅读全文
摘要:这是并发系列第10篇文章。 什么是线程安全? 当多个线程去访问同一个类(对象或方法)的时候,该类都能表现出正常的行为(与自己预想的结果一致),那我们就可以所这个类是线程安全的。 看一段代码: 分析上面代码: 1. 线程t1、t2、t3中调用的方法都需要获取d1的锁,所以他们是互斥的 2. t1/t2
阅读全文
摘要:守护线程 是一种特殊的线程,在后台默默地完成一些系统性的服务,比如 垃圾回收线程 、 JIT线程 都是 守护线程 。与之对应的是 用户线程 ,用户线程可以理解为是系统的工作线程,它会完成这个程序需要完成的业务操作。如果用户线程全部结束了,意味着程序需要完成的业务操作已经结束了,系统可以退出了。 所以
阅读全文
摘要:线程组 我们可以把线程归属到某个线程组中,线程组可以包含多个 线程 以及 线程组 ,线程和线程组组成了父子关系,是个树形结构,如下图: 使用线程组可以方便管理线程,线程组提供了一些方法方便方便我们管理线程。 创建线程关联线程组 创建线程的时候,可以给线程指定一个线程组,代码如下: 输出结果: act
阅读全文
摘要:运行上面代码,会发现程序无法终止。 线程t1的run()方法中有个循环,通过flag来控制循环是否结束,主线程中休眠了1秒,将flag置为false,按说此时线程t1会检测到flag为false,打印“线程t1停止了”,为何和我们期望的结果不一样呢?运行上面的代码我们可以判断,t1中看到的flag一
阅读全文
摘要:新建线程 新建线程很简单。只需要使用new关键字创建一个线程对象,然后调用它的start()启动线程即可。 那么线程start()之后,会干什么呢?线程有个run()方法,start()会创建一个新的线程并让这个线程执行run()方法。 这里需要注意,下面代码也能通过编译,也能正常执行。但是,却不能
阅读全文
摘要:进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。 进程具有的特征: 动态性 :进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的 并发性 :
阅读全文
摘要:JMM(java内存模型),由于并发程序要比串行程序复杂很多,其中一个重要原因是并发程序中数据访问 一致性 和 安全性 将会受到严重挑战。 如何保证一个线程可以看到正确的数据呢? 这个问题看起来很白痴。对于串行程序来说,根本就是小菜一碟,如果你读取一个变量,这个变量的值是1,那么你读取到的一定是1,
阅读全文
摘要:有关为什么要使用并行程序的问题前面已经进行了简单的探讨。总的来说,最重要的应该是处于两个目的。 第一,为了获得更好的性能; 第二,由于业务模型的需要,确实需要多个执行实体。 在这里,我将更加关注第一种情况,也就是有关性能的问题。将串行程序改造为并发程序,一般来说可以提高程序的整体性能,但是究竟能提高
阅读全文
摘要:由于临界区的存在,多线程之间的并发必须受到控制。根据控制并发的策略,我们可以把并发的级别分为 阻塞 、 无饥饿 、 无障碍 、 无锁 、 无等待 几种。 阻塞 一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继续执行。当我们使用synchronized关键字或者重入锁时,我们得到的就是阻塞
阅读全文
摘要:java高并发系列 第1天:必须知道的几个概念 同步(Synchronous)和异步(Asynchronous) 同步和异步通常来形容一次方法调用, 同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为 。 异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以
阅读全文