多线程与并发编程
该专栏从线程的创建讲起,逐渐深入Java多线程原理,以及多线程遇到的安全性问题的解决和Java提供的并发工具类的介绍和使用。
微服务技术栈
这个作者很懒,什么都没留下…
展开
-
FutureTask的使用与原理解析
在Java 多线程编程简介与线程的创建一篇我们介绍了线程的创建方式,分别为继承Thread、实现Runnable接口和实现Callable接口,本篇我们介绍线程的另一种创建方式FutureTask。相对于Runnable的实现方式不能有返回结果,FutureTask对其进行了适配,使其可以返回一个默认的结果,并且支持Callable方式线程的创建。如下我们先使用一个例子介绍FutureTask的使用:private static void futureTaskRunnable() throws Int原创 2020-09-22 16:47:31 · 713 阅读 · 0 评论 -
简析synchronized原理与Java对象中的等待通知机制实现原理
什么是并发编程中的等待通知机制?简而言之就是一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作。在前面的博客Java JUC 并发包组件之LockSupport与Condition的使用中,我们介绍了使用队列同步器实现的等待通知机制,本篇我们介绍使用synchronized实现的Java对象的等待通知机制,等待/通知的相关方法是任意Java对象都具备的,因为这些方法被定义在所有对象的超类 java.lang.Object上,方法和描述如下表所示: 方法名原创 2020-09-21 19:03:39 · 469 阅读 · 0 评论 -
一文读懂Java线程池ScheduledThreadPoolExecutor的使用与运行机制
ScheduledThreadPoolExecutor继承自ThreadPoolExecutor。它主要用来在给定的延迟之后运 行任务,或者定期执行任务。ScheduledThreadPoolExecutor的功能与Timer类似,但 ScheduledThreadPoolExecutor功能更强大、更灵活。Timer对应的是单个后台线程,而 ScheduledThreadPoolExecutor可以在构造函数中指定多个对应的后台线程数。和ThreadPoolExecutor类似,ScheduledTh原创 2020-09-16 21:27:46 · 2343 阅读 · 0 评论 -
一文读懂Java线程池ThreadPoolExecutor的使用
再实际项目中,我们可能会处理执行时间非常短但是数量非常大的请求,这个时候如果为每一个请求创建一个新的线程,可能会导致性能瓶颈。因为线程的创建和销毁的时间可能会大于任务执行的时间,系统性能就会大幅度降低。JDK1.5提供了线程池的支持,它通过线程的复用技术从而省去线程的频繁创建来达到处理大量并发请求的目的。线程池的原理就是创建了一个运行效率比较优异的“ThreadPool”再池中对线程对象进行创建销毁的管理,使用池时只需要执行具体的任务即可,线程对象的处理再池中被封装了。如下是线程池的一个简单的例子:原创 2020-09-16 19:44:02 · 703 阅读 · 0 评论 -
Java JUC 并发包组件之LockSupport与Condition的使用
本篇我们只介绍LockSupport与Condition的部分API和一些概念,不涉及示例,如果想要示例,可以查看JDK源码的阻塞队列部分,我也写了一篇阻塞队列的文章也可以查看。在Java线程状态与生命周期一篇我们介绍Java的声明周期时介绍过在调用LockSupport的方式时会让线程处于WAITiNG状态和返回RUNNABLE状态。LockSupport定义了一组的公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能,它是构建同步组件的基础工具。LockSupport定义了一组以park开头的方法原创 2020-09-10 20:43:38 · 216 阅读 · 0 评论 -
java JUC 并发包之阻塞队列——BlockQueue
在学习完java的同步队列、Lock和等待通知机制之后,再来看阻塞队列会觉得阻塞队列更加容易理解。阻塞队列是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入:当队列满时,队列会阻塞插入元素的线程,直到队列不满;阻塞移除:在队列为空时,获取元素的线程会等待队列变为非空。在阻塞队列不可用时,这两个附加操作提供了4种处理方式jdk为我们提供了一下几种阻塞队列,他们的实现方式几乎是相同的,我们后面以一种方式讲述阻塞队列的实现,如下表为jdk为我们提供的几种阻塞队列与描述:阻塞队列 描述原创 2020-09-10 20:05:42 · 337 阅读 · 0 评论 -
java中原子类与CAS原理
在java.util.concurrent.atomic包中提供了很多原子类,包括三个原子更新基本类型:AtomicBoolean,AtomicInteger,AtomicLong;原子更新数组:AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray;原子更新引用类型:AtomicReferenceFieldUpdater,AtomicMarkableReference,AtomicReference;原子更新字段类:AtomicIntegerFie.原创 2020-09-06 18:39:22 · 238 阅读 · 0 评论 -
队列同步器 AQS原理解析—独占式获取同步状态
在队列同步器 AbstractQueuedSynchronizer 的简单使用一篇我们简单介绍了AbstractQueuedSynchronizer的使用,本篇我们结合上一篇的示例介绍AQS的原理实现。在上一篇我们一直提到的一个词是等待队列,如果获取锁失败,则将当前线程放到等待队列,那么AbstractQueuedSynchronizer中的等待队列到底是什么呢?...原创 2020-09-03 20:56:43 · 297 阅读 · 0 评论 -
AQS 队列同步器 AbstractQueuedSynchronizer 的简单使用
队列同步器AbstractQueuedSynchronizer,是用来构建锁或者其他同步组 件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获 取线程的排队工作。我们可以看一下前面介绍的重入锁,读写锁、或者信号量、CountDownLatch等源码,你会发现他们的源码中总会有一个静态内部类继承了AbstractQueuedSynchronizer,代码示例如下:abstract static class Sync extends AbstractQueuedSy.原创 2020-09-01 17:15:56 · 324 阅读 · 0 评论 -
线程的安全性与Java锁Lock接口的简介与使用
在线程的安全性与synchronized的使用与锁升级一篇我们介绍了线程的安全性与synchronized解决方案,以及锁的升级过程,在该篇中我们知道synchronized是阻塞式的锁,对于性能有很大的影响。而Java SE 5之后,并发包中新增 了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功 能,只是在使用时需要显式地获取和释放锁,这篇内容我们将会介绍并发包中的工具锁重入锁ReentrantLock和读写锁ReentrantReadWriteLock原创 2020-08-31 12:22:15 · 105 阅读 · 0 评论 -
线程的安全性与synchronized的使用与锁升级
所谓线程安全性是指多线程访问共享变量时导致实际值与预期值不符合的问题。所谓共享变量是指可以被多个线程访问到的变量,一般指实例变量或者静态变量,局部变量与方法参数变量为单独线程所有不会存在安全问题,我们下面使用一个例子演示实例变量中的安全问题。如下代码所示,我们创建一个AutoIntegerIncr类,用于整数的自加操作。原创 2020-08-25 20:26:49 · 298 阅读 · 0 评论 -
Java线程状态与生命周期
前面我们介绍了创建线程的三种基本方法,学会如何创建和运行线程之后,接下来就是对线程生命周期的了解,本篇我们介绍Java线程的声明周期,并且使用一些案例演示声明周期的变化。在Thread类中,使用枚举类为Java线程定义了六种状态,代码如下:public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED;}在上述状态中,NEW:初始状态,线程被构建,但原创 2020-08-20 16:40:43 · 231 阅读 · 0 评论 -
Java 多线程编程简介与线程的创建
进程与线程进程是执行中一段程序,即一旦程序被载入到内存中并准备执行,它就是一个进程。进程是表示资源分配的的基本概念,又是调度运行的基本单位,是系统中的并发执行的单位。一个进程就是一个具有独立功能的应用程序。线程是进程中执行运算的最小单位。可以理解为进程中独立运行的子任务。一个线程只能属于一个进程,但是一个进程可以拥有多个线程。多线程处理就是允许一个进程中在同一时刻执行多个任务。线程是进程的实体,属于进程,是CPU调度和分派的基本单位。资源分配给进程,所有线程共享该进程的资源。进程是操作系统分配资原创 2020-08-18 20:40:31 · 149 阅读 · 0 评论