thread
文章平均质量分 77
要争气
人生来平凡,因奋斗进取而不凡。
展开
-
JMM内存模型 原子性 可见性
JMM java内存模型,它是在多线程访问共享数据时,提供原子性、可见性有序性的规则和保障。原子性原子性:一个原子性操作可以包含一条或多条指令,一个原子性操作中的所有指令要么都不执行,要么全部执行且不会收到其他线程操作的影响。package com.tech.jmm;/** * @author lw * @since 2021/12/6 */public class A { static int i=0; static Object o=new Object()原创 2021-12-06 11:15:21 · 436 阅读 · 0 评论 -
DelayQueue延时队列
DelayQueue是一个实现了BlockingQueue接口的类,它也是阻塞队列,但是他还具有一些独特的功能,那就是在获取元素时,需要检测元素是否到达延时时间,如果没有到达延时时间是无法获取到元素的。 队列里的元素需要实现Delay接口,这个接口有一个方法是getDelay,当这个方法返回0或者负数,说明元素已经到达了延时时间,在获取元素时可以正常获取,否则无法获取。Delay接口继承了Comparable接口,重写它的compareTo方法,可以对队列中的元素排序,通常...原创 2021-09-06 15:12:33 · 291 阅读 · 0 评论 -
双重检查锁为什么要使用volatile字段?
前言从Java内存模型出发,结合并发编程中的原子性、可见性、有序性三个角度分析volatile所起的作用,并从汇编角度大致说了volatile的原理,说明了该关键字的应用场景;在这补充一点,分析下volatile是怎么在单例模式中避免双检锁出现的问题的。并发编程的3个条件1、原子性:要实现原子性方式较多,可用synchronized、lock加锁,AtomicInteger等,但volatile关键字是无法保证原子性的;2、可见性:要实现可见性,也可用synchronized、lock,转载 2021-08-04 11:23:18 · 1348 阅读 · 0 评论 -
Java并发之AQS详解
一、概述 谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch...。 以下是本文的目录大纲: 概述 框架 源码详解 简单应用 若有不正之处,请谅解和批评指正,不胜感激。转载 2021-07-16 14:58:38 · 98 阅读 · 0 评论 -
ConcurrentHashMap源码
HashMap是一种应用频率非常高的Map,但它并不是线程安全的,在并发环境put会出现链表闭环,导致get时候无限循环,cpu升值100。Hashtable和Collections.synchronizedMaps是一种线程安全的Map,他们几乎对每个方法加synchronized来保证线程安全性,只能独占式读写,一次只允许一个线程访问读写方法,性能低下,吞吐量低。ConcurrentHashM...原创 2018-09-19 17:30:39 · 131 阅读 · 0 评论 -
LinkedBlockingQueue 源码
add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常 remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常 element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementExceptio...原创 2018-08-13 20:07:17 · 502 阅读 · 0 评论 -
【转】ConcurrentLinkedQueue 原理
一、 前言常用的并发队列有阻塞队列和非阻塞队列,前者使用锁实现,后者则使用CAS非阻塞算法实现,使用非阻塞队列一般性能比较好,下面就看看常用的非阻塞ConcurrentLinkedQueue是如何使用CAS实现的。二、 ConcurrentLinkedQueue类图结构如图ConcurrentLinkedQueue中有两个volatile类型的Node节点分别用来存在列表的首尾节点...转载 2018-08-28 10:47:38 · 216 阅读 · 0 评论 -
【转】LockSupport 原理
一、前言 最开始打算分析ReentrantLock,但是分析到最后,发现离不开LockSuport的支持,所以,索性就先开始分析LockSupport,因为它是锁中的基础,是一个提供锁机制的工具类,所以先对其进行分析。二、LockSupport源码分析 2.1 类的属性 public class LockSupport { // Hotspot impleme...转载 2018-08-28 17:28:57 · 2289 阅读 · 0 评论 -
Semaphore 源码
package cn.semaphore.n1;import java.util.concurrent.Semaphore;public class Pool { private static final int MAX_AVAILABLE=2; private final Semaphore available=new Semaphore(MAX_AVAILABLE, true);...原创 2018-08-07 20:11:53 · 150 阅读 · 0 评论 -
futureTask 源码
private static final int NEW = 0; //任务新建和执行中private static final int COMPLETING = 1; //任务将要执行完毕private static final int NORMAL = 2; //任务正常执行结束private static final int EXCEPTIONAL ...原创 2018-08-07 11:02:22 · 280 阅读 · 0 评论 -
【转】FutureTask实现原理
uture是我们在使用java实现异步时最常用到的一个类,我们可以向线程池提交一个Callable,并通过future对象获取执行结果。本篇文章主要讲述了JUC中FutureTask中的一些实现原理。使用的jdk版本是1.7。Future Future是一个接口,它定义了5个方法: 1 2 3 4 5 boolean can...转载 2018-08-07 10:59:05 · 1766 阅读 · 0 评论 -
CountDownLatch 源码
CountDownLatch(int count) 构造器:如果资源数<0 抛出异常。设置aqs资源数为count。await() 等待,使用AQS共享模式获取资源,中断抛出异常。 尝试获取资源:如果剩余资源数为0成功返回,非0失败返回。countDown() 释放资源,使用AQS共享模式释放资源,尝试释放资源:自旋 如果剩余资源数为0,失败返回,否则 cas修改剩余资源数-1,如果...原创 2018-08-01 19:31:05 · 137 阅读 · 0 评论 -
CyclicBarrier 源码
package cn.cyc.n1;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.LockSupport;...原创 2018-08-09 14:51:20 · 173 阅读 · 0 评论 -
ReentrantReadWriteLock 源码
1 tryAcquire 写锁获取锁,独占模式尝试获取资源:如果其他线程获取了写锁,或者当前线程或其他线程线程获取了读锁,则失败返回。如果当前线程获取了写锁,则重入锁,资源数+1,成功返回。如果资源没有被获取,非公平锁直接cas操作对资源数+1,把当前线程保存到锁上成功返回,公平锁如果aqs线程等待队列有等待的线程,则失败返回。 如果线程持有了读锁,若当前线程申请写锁,会产生死锁:当前线程在独...原创 2018-07-31 10:39:07 · 108 阅读 · 0 评论 -
【转】ReentrantReadWriteLock源码分析
况下去申请写锁(试图锁升级),会导致思索。tryAcquire在这种情况下返回false,AQS的acquire方法会将当前线程放入等待队列去等待写锁,在获取写锁之前不会释放锁持有的读锁,而读锁和写锁不能同时存在,发生死锁,他将永远不能获取这个写锁,其他线程也不能获取写锁,但读锁可被正常获取,只是永远不能获取写锁了。如果c==0时,说明不存在任何锁。调用writerShouldBlock方法判...转载 2018-07-31 10:37:17 · 201 阅读 · 0 评论 -
ReentrantLock 源码 重入锁 非公平锁 公平锁
构造器 无参构造器使用非公平锁,参数是true时候使用公平锁。非公平锁 获取锁:首先cas操作修改aqs同步器的state由0改为1,成功后保存当前线程到锁上,表示抢占了锁。抢占失败 调用aqs同步器独占模式获取锁。提供的尝试获取锁的方法:如果AQS的资源数为0则cas操作修改资源数为指定数量,保存当前线程到锁上,获取锁成功,否则 如果当前线程与占有锁的线程是同一个线程,则重入锁,对资源数做相应增...原创 2018-07-11 14:50:43 · 193 阅读 · 0 评论 -
【转】AtomicInteger 原理
深入解析Java AtomicInteger原子类型在进行并发编程的时候我们需要确保程序在被多个线程并发访问时可以得到正确的结果,也就是实现线程安全。线程安全的定义如下:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么这个类就是线程安全的。举个线程不安全的例子。假如我们想实...转载 2018-08-29 11:30:43 · 666 阅读 · 0 评论 -
基于AtomicBoolean实现的简易锁
package cn.mn.app.ls;import java.util.Queue;import java.util.concurrent.ConcurrentLinkedQueue;import java.util.concurrent.atomic.AtomicBoolean;import java.util.concurrent.locks.LockSupport;/**...原创 2018-08-30 16:00:20 · 1270 阅读 · 0 评论 -
JAVA并发编程的艺术之CPU实现原子性操作
CPU可以通过总线锁定和缓存锁定,实现原子性操作,保证当一个CPU在操作某个变量的缓存的时候,其他CPU无法操作这个变量的缓存,再结合缓存一致性协议,当发出锁定信号的CPU把更新从缓存回写到系统内存时候后,其他CPU缓存失效。总线锁定:锁定CPU和内存之间的通信,当一个CPU发出总线锁定信号后,其他CPU无法访问内存中的任何数据,其开销比较大。缓存锁定:主要是对总线锁定的一种优化,它...原创 2019-09-21 17:52:01 · 169 阅读 · 0 评论 -
synchronized的实现原理
常见三种使用方法: 1)普通同步方法,锁是当前实例; 2)静态同步方法,锁是当前类的Class实例,Class数据存在永久代中,是该类的一个全局锁; 3)对于同步代码块,锁是synchronized括号里配置的对象。 Java中的每个对象都可以作为锁。当一个线程访问同步代码块时,需要首先获取锁,退出代码块或抛出异常时必须释放锁 “锁”到底是个什么东东?...转载 2019-07-26 10:33:06 · 108 阅读 · 0 评论 -
synchronized底层实现原理及锁优化
一、概述1、synchronized作用原子性:synchronized保证语句块内操作是原子的可见性:synchronized保证可见性(通过“在执行unlock之前,必须先把此变量同步回主内存”实现)有序性:synchronized保证有序性(通过“一个变量在同一时刻只允许一条线程对其进行lock操作”)2、synchronized的使用修饰实例方法,对当前实例对象加锁修饰静...转载 2019-07-26 10:31:45 · 596 阅读 · 0 评论 -
线程的状态
Thread源码里定义了6种状态,如下: * A thread state. A thread can be in one of the following states: * <ul> * <li>{@link #NEW}<br> * A thread that has not yet starte...原创 2019-04-24 16:20:55 · 138 阅读 · 0 评论 -
LockSupport park unpark的执行时序和生效关系
一个unpark,可以抵消过去的一个park或者将来的一个park。多个unpark,可以抵消过去的多个park。多个unpark,不可以抵消将来的多个park。package cn.zh.t1;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.LockSupport;public cl...原创 2018-12-11 10:02:56 · 1046 阅读 · 0 评论 -
CopyOnWriteArrayList源码
2个copy数组元素的方法:Arrays.copyOf(original, newLength) 拷贝源数组,生成一个新数组 可以指定拷贝数量;System.arraycopy(src, srcPos, dest, destPos, length); 从某个索引位置拷贝源数组,到指定数组的指定位置,会被源数组值覆盖,可以指定拷贝数量;array 底层数组,它是volatile修饰,确保可见...原创 2018-09-20 15:06:34 · 408 阅读 · 1 评论 -
【转】Java并发编程笔记之CopyOnWriteArrayList源码分析
并发包中并发List只有CopyOnWriteArrayList这一个,CopyOnWriteArrayList是一个线程安全的ArrayList,对其进行修改操作和元素迭代操作都是在底层创建一个拷贝数组(快照)上进行的,也就是写时拷贝策略。我们首先看一下CopyOnWriteArrayList的类图有哪些属性和方法,如下图所示:如上,CopyOnWriteArrayList的类图,每...转载 2018-09-20 15:05:23 · 169 阅读 · 0 评论 -
ThreadLocal源码
线程Thread存在一个字段,它是ThreadLocalMap,它和Map类似,key是ThreadLocal对象,值是设置的值。get() 获取当前线程,获取当前线程持有的ThreadLocalMap,【果map是null,则调用初始化逻辑:获取当前线程,获取当前线程持有的ThreadLocalMap,如果map是null则以ThreadLocal为key,初始化值为val保存map,如果m...原创 2018-09-25 16:00:38 · 120 阅读 · 0 评论 -
【转】Java并发编程:深入剖析ThreadLocal
想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理。首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两个应用场景。 以下是本文目录大纲: 一.对ThreadLocal的理解 二.深入解析ThreadLocal类 三.Threa...转载 2018-09-25 15:58:58 · 104 阅读 · 0 评论 -
【转】java-并发-ConcurrentHashMap高并发机制-jdk1.8
JDK8的版本,与JDK6的版本有很大的差异。实现线程安全的思想也已经完全变了,它摒弃了Segment(锁段)的概念,而是启用了一种全新的方式实现,利用CAS算法。它沿用了与它同时期的HashMap版本的思想,底层依然由“数组”+链表+红黑树的方式思想,但是为了做到并发,又增加了很多辅助的类,例如TreeBin,Traverser等对象内部类。CAS算法实现无锁化的修改值的操作,他可以大大降低锁代...转载 2018-09-19 17:29:55 · 1077 阅读 · 1 评论 -
【转】ConcurrentHashMap源码分析
0、说明 ※为了分析源码的时候方便调试,把ConcurrentHashMap的源码放在本地了,名字改为了ConcurrentHashMapDebug由于源码中的unsafe有很多限制,不能直接在本地使用,所以,在源码的最后面的静态代码块处修改了U的初始化方法。private static final sun.misc.Unsafe U;static{ U = getUn...转载 2018-09-19 17:28:11 · 167 阅读 · 0 评论 -
AQS同步器框架 源码
state 同步器中共享资源,它是volatile类型确保内存可见性。Node 线程等待队列,保存线程。节点等待状态 CANCELLED 取消等待,需要在节点中移除。SIGNAL 等待唤醒。0 初始状态。CONDITION 节点处于等待CONDITION。PROPAGATE 共享模式,节点线程处于可运行状态。head 首节点。tail 尾节点。tryAcquire 尝试获取独占资源,成功返...原创 2020-05-16 11:40:32 · 495 阅读 · 0 评论 -
【转】AQS条件队列应用
相比于独占锁跟共享锁,AbstractQueuedSynchronizer中的条件队列可能被关注的并不是很多,但它在阻塞队列的实现里起着至关重要的作用,同时如果想全面了解AQS,条件队列也是必须要学习的。原文地址:http://www.jianshu.com/p/3f8b08ca21cd这篇文章会涉及到AQS中独占锁跟共享锁的一些知识,如果你已经对这两块内容很了解了,那就直接往下看。否则在读本文之...转载 2018-07-10 20:25:10 · 463 阅读 · 0 评论 -
【转】AQS条件队列
相比于独占锁跟共享锁,AbstractQueuedSynchronizer中的条件队列可能被关注的并不是很多,但它在阻塞队列的实现里起着至关重要的作用,同时如果想全面了解AQS,条件队列也是必须要学习的。原文地址:http://www.jianshu.com/p/3f8b08ca21cd这篇文章会涉及到AQS中独占锁跟共享锁的一些知识,如果你已经对这两块内容很了解了,那就直接往下看。否则在读本文之...转载 2018-07-10 20:24:05 · 224 阅读 · 0 评论 -
DelayQueue 延时阻塞队列
DelayQueue 是一种阻塞队列,它里面的元素需要实现Delayed接口。它会可以对元素按过期时间排序,取出的元素是最先过期的元素,如果当前没有过期的元素,调用take时候将会阻塞,队列为空时候,调用take也会阻塞。元素:package cn.t2;import java.util.concurrent.Delayed;import java.util.concurrent.TimeU...原创 2018-02-28 16:26:47 · 654 阅读 · 0 评论 -
JVM结束时运行关闭钩子
JVM正常结束时: 正常结束时,首先调用已注册的关闭钩子,关闭钩子是在Runtime上注册的线程,在关闭钩子执行完毕后,JVM调用终结器,结束运行。如果关闭钩子没有停止运行,JVM不会结束运行。在JVM最终结束运行时,如果此时还有正在运行的应用程序线程,那么这些线程会被强行关闭。JVM强行结束时: 强行结束时,不会运行关闭钩子。package cn.t5;public class ...原创 2018-03-08 10:35:21 · 1112 阅读 · 0 评论 -
Executor框架中的线程池
线程池:线程池:管理线程的资源池。线程池与任务队列相关,工作线程在任务队列里获取任务,执行任务,返回线程池,等待下一个任务的到来。使用线程池管理任务,比为每个任务创建线程的好处: 1 线程池里的线程可以复用,减少了线程创建和销毁的资源开支。 2 线程池里一般存在一部分线程,处理任务时候不必去着急创建线程,可以提高响应性。 3 合理设置线程池里的线程,使服务器既保持忙碌状态,又不会...原创 2018-02-28 10:52:07 · 609 阅读 · 0 评论 -
java同步工具类总结
一 闭锁 闭锁:延缓线程的进度,直到闭锁到达终止状态。闭锁到达终止状态后,其状态不会再发生变化,也就不会再阻塞线程。1.1 CountDownLatch闭锁 CountDownLatch使用构造器初始化一个计数器,线程调用countDown方法计数器值减1,调用await方法时,只有计数器值不为0,就会阻塞,为0时解除阻塞。 package cn.concurrent.t11;imp...原创 2018-02-08 11:19:52 · 509 阅读 · 0 评论 -
关闭线程池shutdownNow()方法的局限性
shutdown():等待那些已经开始的任务执行完毕,等待任务队列中尚未开始的任务执行完毕。shutdownNow():尝试取消已经开始的任务(中断这些任务),返回任务队列中尚未开始的任务。shutdownNow只返回任务队列中尚未开始的任务列表,但是想要记录那些已经开始但被取消的任务,可以使用条件检查:线程池的状态处于关闭中且任务的状态为已中断(当然前提是任务要保持中断状态)。之前对中断有点误解...原创 2018-03-07 16:05:14 · 2035 阅读 · 0 评论 -
栅栏Exchanger
Exchanger与CyclicBarrier区别是,前者可以用于2个线程交换数据。Exchanger一般用于2个线程,在到达栅栏位置调用exchange(Object o)方法,如果全部线程没有到达栅栏位置,此时先到的线程会阻塞,只到全部线程到达栅栏位置。exchange方法会提交本线程的数据(参数),获取另外一个线程提交的数据(响应)。package cn.concurrent.t原创 2018-02-07 12:07:28 · 279 阅读 · 0 评论 -
栅栏 CyclicBarrier
栅栏:所有线程到达栅栏位置之前,先到达的线程会被阻塞,直到所有线程全部到达栅栏位置,全部线程继续执行。栅栏等待的是线程,到达终止状态会被重置,可以继续使用,这一点与闭锁不同,闭锁等待的是事件,到达终止状态状态不可以再改变。CyclicBarrier是一种栅栏,构造器可以初始化线程数量,还可以初始化一个Runnable任务,在栅栏释放,所有线程继续执行时选择一个线程来执行Runnable任务。原创 2018-02-07 12:03:52 · 244 阅读 · 0 评论 -
信号量Semaphore
信号量用来限制同一时间访问同一资源的线程的数量,可以实现资源池。信号量会初始化一定数量的虚拟许可,线程在执行操作前会先获取许可,若当前没有可用许可线程会阻塞,直到有可用许可,操作完成后会释放许可。package cn.concurrent.t10;import java.util.concurrent.Semaphore;public class T4 { private final原创 2018-02-06 15:40:04 · 227 阅读 · 0 评论