java多线程
lizc_lizc
好好学习,天天向上。
展开
-
定时线程池ScheduledThreadPoolExecutor
文章目录简介内部类主要方法总结简介ScheduledThreadPoolExecutor 继承了 ThreadPoolExecutor 并实现了ScheduledExecutorService接口 。线程池队列是DelayedWorkQueue,它和 DelayedQueue原理类似,都是一个延迟队列。在ScheduledThreadPoolExecutor中阻塞队列存储的是Scheduled...原创 2019-11-09 16:16:36 · 345 阅读 · 0 评论 -
线程池ThreadPoolExecutor
文章目录简介ThreadPoolExecutor主要属性核心参数线程池实现原理内部类submit(Callable task)executeaddWorkerrunWorkershutdownshutdownNowawaitTermination总结简介线程池主要解决两个问题,一是当执行大量异步任务时线程池能够提供较好的性能。在不使用线程池时,每当需要执行异步任务时直接 new 一个线程来运行...原创 2019-11-09 11:11:14 · 189 阅读 · 0 评论 -
FutureTask源码分析
文章目录简介用法主要属性主要方法总结简介FutureTask实现了RunnableFuture,RunnableFuture继承了Runnable和Future接口。Future接口和实现Future接口的FutureTask类,代表异步计算的结果。所以FutureTask既能当做一个Runnable直接被Thread执行,也能作为Future用来得到异步计算的结果。用法public st...原创 2019-11-09 10:56:38 · 112 阅读 · 0 评论 -
DelayQueue
文章目录简介用法主要属性入队列出队列总结简介DelayQueue是一个无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的Delayed 元素。 DelayQueue中存储的所有元素必须实现Delayed接口 。用法public class Main { public static void main(String[] args) throws ...原创 2019-11-05 21:24:08 · 130 阅读 · 0 评论 -
PriorityBlockingQueue
文章目录简介主要属性入队出队简介PriorityBlockingQueue是一个支持优先级的无界阻塞队列,直到系统资源耗尽。默认情况下元素采用自然顺序升序排列。也可以自定义类实现compareTo()方法来指定元素排序规则,或者初始化PriorityBlockingQueue时,指定构造参数Comparator来对元素进行排序。但需要注意的是不能保证同优先级元素的顺序。PriorityBloc...原创 2019-11-05 21:23:17 · 216 阅读 · 0 评论 -
PriorityQueue
文章目录简介主要属性入队出队列总结简介PriorityQueue是一个小根堆, 它是无序的,只有堆顶存储着最小的元素。PriorityQueue是一个无界的线程不安全的非阻塞队列。主要属性// 队列默认初始容量private static final int DEFAULT_INITIAL_CAPACITY = 11;// 存储元素的数组transient Object[] queu...原创 2019-11-03 23:49:27 · 127 阅读 · 0 评论 -
LinkedBlockingQueue
文章目录简介主要属性入队列出队列总结简介LinkedBlockingQueue是采用单链表实现的有界阻塞安全队列 。主要属性// 内部节点,用来存储队列元素static class Node<E> { // 节点元素 E item; // 指向下一个节点 Node<E> next; Node(E x) { item = x;...原创 2019-11-02 18:08:26 · 238 阅读 · 0 评论 -
ArrayBlockingQueue
文章目录简介主要属性入队列出队列总结简介ArrayBlockingQueue是采用数组实现的有界阻塞线程安全队列 。 线程安全是指,ArrayBlockingQueue内部通过“互斥锁”保护竞争资源,实现了多线程对竞争资源的互斥访问。主要属性/** 使用数组存储队列的元素 */final Object[] items;/** 每次获取元素时的数组下标,默认为0*/int takeI...原创 2019-11-02 16:35:54 · 126 阅读 · 0 评论 -
CyclicBarrier
文章目录简介用法类属性await()总结简介CyclicBarrier可以阻塞一组线程直到这些线程同时达到某个条件才继续执行。 当线程到达栅栏位置时将调用await方法,这个方法将阻塞当前线程直到所有线程都到达栅栏位置。如果所有线程都到达栅栏位置,那么栅栏将打开,此时所有的线程都将被释放,而栅栏将被被重置以便下次使用。用法public static void main(String[] a...原创 2019-11-02 16:28:33 · 77 阅读 · 0 评论 -
CountDownLatch
文章目录简介构造函数内部类countDown()await()示例简介CountDownLatch允许一个或者多个线程等待其它线程完成操作。CountDownLatch 是通过一个计数器来实现的,当我们在 new 一个 CountDownLatch 对象的时候,需要带入该计数器值,该值就表示了线程的数量。每当一个线程完成自己的任务后,计数器的值就会减 1 。当计数器的值变为0时,就表示...原创 2019-11-02 13:29:43 · 118 阅读 · 0 评论 -
Semaphore
文章目录简介内部类非公平锁公平锁简介Semaphore信号量,用来控制同时访问特定资源的线程数量,他通过协调各个线程,以保证合理地使用公用资源。内部类abstract static class Sync extends AbstractQueuedSynchronizer {}// 非公平锁static final class NonfairSync extends Sync { ...原创 2019-11-02 13:24:57 · 357 阅读 · 0 评论 -
ReentrantReadWriteLock
文章目录简介内部类读写状态的设计写锁的获取与释放读锁的获取与释放简介读写锁是一种特殊的锁,它把对共享资源的访问分为读访问和写访问,多个线程可以同时对共享资源进行读访问,但是同一时间只能有一个线程对共享资源进行写访问,使用读写锁可以极大地提高并发量。内部类abstract static class Sync extends AbstractQueuedSynchronizer {}pub...原创 2019-11-02 13:22:26 · 114 阅读 · 0 评论 -
ReentrantLock
文章目录简介内部类构造方法公平锁与非公平锁非公平锁公平锁条件锁简介用法源码分析简介ReentrantLock实现了Lock接口public interface Lock { /** * 获取锁 */ void lock(); /** * 获取锁,可以中断 */ void lockInterruptibly() throw...原创 2019-11-02 13:19:03 · 100 阅读 · 0 评论 -
AbstractQueuedSynchronizer
简介AQS的全称是AbstractQueuedSynchronizer,是一个抽象类。它的定位是为Java中几乎所有的锁和同步器提供一个基础框架。AQS是基于FIFO的队列实现的,并且内部维护了一个状态变量state,通过原子操作更新这个状态变量state即可以实现加锁解锁操作。一个同步器拥有一个同步队列,可以拥有零个或者多个等待队列。节点是构成同步队列的基础,同步器拥有首节点(head)...原创 2019-11-02 13:17:17 · 119 阅读 · 0 评论 -
伪共享
CPU缓存行缓存是由缓存行组成的,通常是 64 字节(常用处理器的缓存行是 64 字节的,比较旧的处理器缓存行是 32 字节),并且它有效地引用主内存中的一块地址。一个 Java 的 long 类型是 8 字节,因此在一个缓存行中可以存 8 个 long 类型的变量。在程序运行的过程中,缓存每次更新都从主内存中加载连续的 64 个字节。因此,如果访问一个 long 类型的数组时,当数组中的一...原创 2019-11-02 13:07:35 · 141 阅读 · 0 评论 -
volatile、synchronized、final内存语义
volatile内存语义当写volatile变量时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存。当读volatile变量时,volatile变量的每次使用都必须从主内存刷新最新的值。JMM针对编译器对编译器指定的volatile重排序规则表 是否能重排序 第二个操作 第一个操作 普通读/写 volatile读 volat...原创 2019-11-02 13:05:12 · 329 阅读 · 1 评论 -
volatile
volatile简介java内存模型规定,volatile变量的每次修改都必须立即回写到主内存中,volatile变量的每次使用都必须从主内存刷新最新的值。可见性volatile可见性示例public class VolatileTest { // public static int finished = 0; public static volatile int fin...原创 2019-11-02 13:02:50 · 117 阅读 · 0 评论 -
线程基础
线程基础什么是线程 线程是进程中的一个实体,线程本身是不会独立存在的。进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程的一个执行路径,一个进程中至少有一个线程,进程中线程共享进程 资源。 操作系统在分配资源时,是把资源分配给CPU的, 但是 CPU 资源比较特殊, 它是被分配到线程的,因为真正要占用CPU运行的是线程,所以也说线程是 CPU 分配...原创 2019-11-02 12:58:27 · 144 阅读 · 0 评论 -
CountDownLatch基本用法
假设现在有A任务和B任务,而B任务需要A任务的计算结果,因此需要A任务执行完毕才能执行B任务。现在假设A任务是一个十分耗时的任务,因此我们需要开启10线程同时运行以减少运行时间,那么如何判断A任务的10个线程已经执行完毕了呢?我们可以用CountDownLatch来解决这个问题,代码如下:@Slf4jpublic class CountDownLatchExample1 { pri...原创 2018-07-21 12:55:45 · 281 阅读 · 0 评论 -
Semaphore-信号灯的简单实用
当我们创建一个可扩展大小的线程池,并且需要在线程池内同时让有限数目的线程并发运行时,就需要用到Semaphore(信号灯机制),Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目,它是一个计数信号量,从概念上讲,信号量维护了一个许可集合,如有必要,在许可可用前会阻塞每一个acquire(),然后再获取该许可,每个release() 添加一个许可,从而可能释放一个正在阻塞的获...原创 2018-07-21 12:37:47 · 440 阅读 · 0 评论 -
线程间通信
等待/通知机制的实现 方法wait()的作用是使当前执行代码的线程进行等待,wait()方法是Object类的方法,该方法用来将当前线程置入“预执行队列中”,并且在wait()所在的代码行处停止执行,知道接到通知或被中断为止。在调用wait()之前,线程必须获得该对象的对象级别锁,即只能在同步方法或者同步块中调用wait()方法。在执行wait()方法后,当前线程释放锁。 ...原创 2018-05-23 09:58:56 · 131 阅读 · 0 评论 -
停止线程
大多数停止一个线程的操作方法是Thread.interrupt();方法,尽管方法的名称是“停止,终止”的意思,但这个方法不会终止一个正在运行的线程,还需要加一个判断才可以完成线程的停止。 在Java中有以下3种方法可以终止正在运行的线程: (1)使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。 (2)使用stop方法强行...原创 2018-04-21 15:25:34 · 158 阅读 · 0 评论