
并发编程
文章平均质量分 78
MrMoving
running on the way
展开
-
ThreadPoolExecutor
了解字段ctl先介绍一下这段代码的意义,变量 ctl 的注释说明如下:线程池状态量ctl是一个原子整数,封装了两个概念字段workerCount,表示有效线程数;runState,表示线程池的运行状态; // 线程池状态量,默认为-1 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); // 位移常量,29位 private static final int COUNT_B原创 2021-11-25 11:50:52 · 122 阅读 · 0 评论 -
LockSupport分析
LockSupportLockSupport是一个线程阻塞工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,当然阻塞之后肯定得有唤醒的方法。源码如下:public class LockSupport { private LockSupport() {} // Cannot be instantiated. private static void setBlocker(Thread t, Object arg) { UNSAFE.putObject(t, park转载 2020-12-24 15:34:39 · 182 阅读 · 0 评论 -
Executor框架
一、Executor框架介绍Executor框架是JDK1.5之后出现的,位于juc包中,是并发程序设计的工具之一。1.5之前Java的线程既是工作单元,也是执行机制。从JDK5开始,把工作单元和执行机制分离开来。工作单元包括Runnable和Callable,而执行机制由Executor框架提供。Executor框架主要由3部分组成:任务的定义。包括被执行任务需要实现的接口:Runnable接口或者Callable接口。任务的执行。包括任务执行机制的核心接口Executor,以及继承自Execu原创 2020-11-23 15:50:06 · 336 阅读 · 0 评论 -
乐观锁和悲观锁
乐观锁在关系数据库管理系统里,乐观并发控制(又名”乐观锁”,Optimistic Concurrency Control,缩写”OCC”)是一种并发控制的方法。它假设多用户并发的事务在处理时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的 那部分数据。在提交数据更新之前,每个事务会先检查在该事务读取数据后,有没有其他事务又修改了该数据。如果其他事务有更新的话,正在提交的事务会进行...原创 2020-11-19 14:28:09 · 277 阅读 · 0 评论 -
Java线程状态RUNNABLE详解
Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事。具体而言,这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态:什么是 RUNNABLE?直接看它的 Javadoc 中的说明:一个在 JVM 中执行 的线程处于这一状态中。(A thread executing in the Java virtual machine is in this state.)而传统的进(线)程状态一般划分如下(基于操作系统层面,以cpu转载 2020-11-03 20:53:50 · 10689 阅读 · 1 评论 -
线程组
线程组的核心在于方便批量管理同一类线程,定义线程的共性行为。比如某个线程出现异常,则中断该组中所有线程。推荐博文https://www.cnblogs.com/noteless/p/10354721.html#1. 私有的无参构造方法会构造一个system线程组,也被称之为根线程组。该方法由C代码调用 /** * Creates an empty Thread gro...原创 2019-11-04 17:51:16 · 208 阅读 · 0 评论 -
Future模式介绍
普通模式与Future模式的简单对比:1. 普通模式在处理多任务时是串行的,在遇到耗时操作的时候只能等待,直到阻塞被解除,才会继续执行下一个任务2. Future模式,只是发起了耗时操作,函数立马就返回了,真正执行具体操作由另外一个工作线程去完成,并不会阻塞客户端线程。所以在工作线程执行耗时操作的时候客户端无需等待,可以继续做其他事情,等到需要的时候再向工作线程获取结果。Futur...原创 2019-11-01 12:36:38 · 1662 阅读 · 0 评论 -
为什么使用多线程,多线程如何提高效率
一、 从多线程提高程序执行效率的角度,讨论如何提高效率以及为什么使用多线程1.1 在多核处理系统上,将要执行的任务分割成多个可并行执行线程,就可以提高执行速率1.2 单处理器上多线程只能并发执行而不是并行,并发原理,其实就是cpu快速来回切换,在特定的时间执行特定的某一个任务。并发执行存在着线程间上下文切换的问题,会消耗一定的时间。如果不考虑阻塞,多线程并发执行其实比单线程执行更加耗费时间...原创 2019-10-31 19:03:22 · 7593 阅读 · 2 评论 -
Future以及FutureTask
Future介绍在学习Future之前,需要先了解传统模式与future模式的区别,我觉得这个很重要。但是确实又不好说明,另起一篇文章。https://blog.csdn.net/java_lifeng/article/details/102844190future模式是一种并发设计模式,Future接口是JDK对该模式提供的一种实现,两者并无必然关系。1. Future表示异步...原创 2019-11-03 16:53:14 · 597 阅读 · 0 评论 -
多线程下的异常捕获
推荐博文https://www.cnblogs.com/noteless/p/10354733.html这篇博文已经很详细了,超赞,没什么能补充的对于最后提出的一个问题:对于未检查异常,你也可以进行try catch,但是代码始终包裹在try中,真的好吗?情景:在run方法中是不能够抛出异常的,如果是已检查的异常,那么必须进行try catch。对于未检查的异常,如果没有进行处理,...原创 2019-11-04 22:28:51 · 733 阅读 · 0 评论 -
Thread构造方法分析
Thread作为线程的抽象,Thread的实例用于描述线程,对线程的操纵,就是对Thread实例对象的管理与控制。创建一个线程这个问题,也就转换为如何构造一个正确的Thread对象。JDK1.7及之前Thread构造方法如下注1 :jdk1.8.0_201版本下,新增了一个构造方法,但是该方法是非 public 的一、构造方法核心如前面两个图所示,Thread所有的构造...原创 2019-10-30 20:40:37 · 1254 阅读 · 0 评论 -
Thread start/run方法分析
仔细琢磨 start 方法,我们可以得到很多结论查看 Thread 中start 方法的源码 public synchronized void start() { /** * This method is not invoked for the main method thread or "system" * group threads...原创 2019-10-31 13:54:46 · 357 阅读 · 0 评论 -
并发和并行的区别?一个很容易混淆,被忽略的问题
并发(concurrency)和并行(parallellism)是:解释一:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。 解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。 解释三:并发是在一台处理器上“同时”处理多个任务,并行在多台处理器上同时处理多个任务。如hadoop分布式集群所以并发编程的目标是充分的利用处理器的每一个核,...转载 2019-10-24 23:49:17 · 773 阅读 · 1 评论 -
IO会一直占用CPU吗?一个很好的关于并发/并行系统的问题
转载,有少部分个人理解和修改,红字标出这是一个很好的关于并发/并行系统的问题。简单回答就是:IO所需要的CPU资源非常少。大部分工作是分派给DMA(Direct Memory Access)直接内存存取 完成的。先不谈传统的5大IO模型,先说说并发(Concurrencey)。一个非常不严谨的解释就是同时做A和B两件事。先做一会儿进程A,然后上下文切换,再做一会儿B。过一会儿在切回来继续...转载 2019-10-24 23:11:38 · 7603 阅读 · 4 评论 -
从源码角度学习Timer定时器
Timer定时器通过一个后台线程(成员变量thread)来执行任务调度,每个Timer对象对应的是一个单一的后台线程,用于执行所有的定时器的任务,所以,定时器的任务应该很快完成,如果某个任务执行花费过多时间,它会长时间占用该线程,导致其他任务延迟执行以及扎堆执行。这个类是线程安全的,多个线程可以共享给一个Timer对象,而不需要外部进行同步。Timer1. 成员变量任务队列,参...原创 2019-10-21 15:43:22 · 253 阅读 · 0 评论 -
lock学习笔记01
一:为什么要学习lock,synchronized和lock的区别此部分转载,原文链接已失效请注意, Lock实例只是普通对象,它们本身可以用作synchronized语句中的目标。 获取Lock实例的监视器锁与调用该实例的任何lock()方法没有特定关系。 建议为避免混淆,不要以这种方式使用Lock实例。1、synchronized和lock的用法区别synchronized:在...原创 2019-10-16 09:57:18 · 177 阅读 · 0 评论 -
lock学习笔记02
lock实现ReentrantLock分析ReentrantLock 是 JUC 中提供的可中断, 可重入获取, 支持超时, 支持尝试获取锁ReentrantLock 内部封装了成员变量 private final Sync sync;1. lock操作1.1 非公平锁 ,获取锁的方式是随机竞争的,新来的线程也有机会抢占锁 public ReentrantLock() {...原创 2019-10-10 18:29:28 · 268 阅读 · 0 评论 -
java中断机制
1. 引言 当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时……都需要通过一个线程去取消另一个线程正在执行的任务。Java没有提供一种安全直接的方法来停止某个线程,但是Java提供了中断机制。 如果对Java中断没有一个全面的了解,可能会误以为被中断的线程将立马退出运行,但事实并非如此。中断机制是如何工作的?捕获或检测到中断后,...转载 2019-10-10 18:17:55 · 142 阅读 · 0 评论 -
AQS之Node学习
node的结构static final class Node { // 共享模式 static final Node SHARED = new Node(); // 独占模式 static final Node EXCLUSIVE = null; static final int CANCELLED = 1; static ...原创 2019-10-10 15:49:53 · 898 阅读 · 0 评论 -
Condition学习
转载自多篇文章,加入了一些自己的理解。 Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition的await()、signal()这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition,阻塞队列实际上是使用了Conditi...原创 2019-10-10 17:02:33 · 213 阅读 · 1 评论 -
ThreadLoacl、InheritableThreadLocal学习
如果写过多线程的代码,你肯定考虑过线程安全问题,更进一步你可能还考虑在在线程安全的前提下性能的问题。大多数情况下大家用来解决线程安全问题都会使用同步,比如用synchron或者concurrent包提供的各种锁,当然这些都能解决问题。但有多线程做同步一定会涉及到资源争抢和等待的问题。java中各种同步方法都是提供一种准入机制,JVM会调用系统同步原语来保证临界区任意时刻只能有一个线程进入,那必然其...原创 2019-10-09 16:41:20 · 177 阅读 · 0 评论 -
CAS系列
一:理解Java并发里面的CAS概念前言:我们知道在Java多线程里面关于共享变量的操作,一定是要使用线程同步来保证线程安全的,一旦涉及线程同步,就需要加锁,一旦加锁就意味着某一个时候只能有一个线程在操作,其他的线程如果没有得到锁就会阻塞起来,此时的线程的状态是BLOCKED,当前面的线程释放锁的时候,系统会自动调度当前的线程进入临界区,这里面存在一个问题,就是线程的上下文切换的问题,虽然比...转载 2019-10-08 14:41:12 · 144 阅读 · 0 评论 -
多线程之管道流
没用过,mark,看代码就行,用法逻辑很简单。java语言中提供了各种各样的流供我们操纵数据,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据。一个线程发送数据到输出管道,另一个线程从输入管道读取数据,通过使用管道,实现不同线程间的通信,而无需借助于临时文件之类的东西。在java jdk中提供了4个类用于线程间通信,分别是字节流和字符流,应用起来大体相同:...原创 2019-09-29 10:15:48 · 823 阅读 · 0 评论 -
volatile关键字学习
先说一下我在学习Java多线程编程核心技术这本书时,遇到的一个问题。在学习volatile关键字时,下面代码是书上为演示死循环的一个demo。事实上,它也确实一定会产生死循环(为什么死循环可以参考下方链接)。但是我在测试时在for循环中加入了一个打印语句,仅仅这一行就打破了这个死循环,让我纠结了好久,为什么它不会产生死循环了。我尝试把这行代码换成其他无关紧要的语句,比如int i =...原创 2019-09-10 18:06:12 · 131 阅读 · 2 评论 -
Thread类学习
涉及源码的解读暂不在该文章中探究。1. public static native Thread currentThread():返回该代码段正在被哪个线程调用的信息2. public final native boolean isAlive():测试线程是否处于活动状态(正在运行或准备运行的状态)3. 判断线程是否是停止状态 ****/** * Tests whether th...原创 2019-09-06 10:53:42 · 213 阅读 · 0 评论 -
多线程知识点总结01
目录一:认识多线程1. 程序、进程、线程2. 为什么要使用线程3. 多线程的原理4. 多线程的优缺点二:基本使用及特性1. 创建线程的方式:2. 线程的生命周期3. 线程的优先级4. 守护线程、线程调度注意事项:三、线程同步与锁1. synchronized关键字2. 同步方法与同步代码块3. 静态同步方法与synchronized(cl...原创 2019-09-05 18:29:51 · 634 阅读 · 0 评论