并发编程
文章平均质量分 82
主要为多线程开发所涉及的技术
茫然背影
这个作者很懒,什么都没留下…
展开
-
手写阻塞队列V1
public class MyBlockingQueue<E> { public static void main(String[] args) throws Exception { MyBlockingQueue<Integer> blockingQueue = new MyBlockingQueue<Integer>(5); new Thread(new Runnable() { @Override.原创 2021-07-02 20:43:11 · 153 阅读 · 0 评论 -
LinkedBlockingQueue源码分析
目录LinkedBlockingQueue实现总结基本认识put(E e)方法E take()方法remove()方法size()方法LinkedBlockingQueue实现总结LinkedBlockingQueue底层是一个链表(可以指定容量,默认是Integer.MAX_VALUE),维持了两把锁,一把锁用于入队,一把锁用于出队,并且使用一个AtomicInterger类型的变量保证线程安全,AtomicInterger:表示当前队列中含有的元素个数:生产者不断进原创 2021-05-14 18:19:07 · 81 阅读 · 0 评论 -
ArrayBlockingQueue阻塞队列实现分析
基本认识:生产者去生产和消费者去消费都需要拿到此锁,拿不到就进入lock的AQS队列:ReerantLock lock 消费者去消费的条件队列:Condition notEmpty 生产者继续生产的条件队列:Condition notFull putIndex(每一轮都是从0-array.length,走到array.length后,继续从0开始下一轮):下一个生产者生产的位置 takeIndex(每一轮都是从0-array.length,走到array.length后,继续从0开始下一轮):下原创 2021-05-14 14:50:36 · 264 阅读 · 0 评论 -
Lock Condition源码分析
JUC提供了Lock可以方便的进行锁操作,但是有时候我们也需要对线程进行条件性的阻塞和唤醒,这时我们就需要condition条件变量,它就像是在线程上加了多个开关,可以方便的对持有锁的线程进行阻塞和唤醒。Condition的概念Condition主要是为了在J.U.C框架中提供和Java传统的监视器风格的wait,notify和notifyAll方法类似的功能。JDK的官方解释如下:条件(也称为条件队列 或条件变量)为线程提供了一个含义,以便在某个状态条件现在可能为 true 的另一个线程通.翻译 2021-05-14 11:32:10 · 207 阅读 · 0 评论 -
ConcurrentHashMap精简篇(无源码)
目录Concurrent HashMap(数组+链表+红黑树)ConcurrentHashMap.transfer()多线程扩容ConcurrentHashMap扩容源码分析总结:ConcurrentHashMap.put()过程总结((hash值)& (数组长度-1)确定位置)ConcurrentHashMap.get()(hash值)& (数组长度-1)确定位置)扩容时可以get】ConcurrentHashMap.size()Jdk1.7Concurrent原创 2021-05-13 18:21:34 · 379 阅读 · 3 评论 -
ThreadPoolExecutor线程池原理
思考:核心线程怎么实现不释放的?临时线程又是怎么实现释放的?核心线程: while(true)逻辑: 从阻塞队列里获取任务take(),获取到就继续执行,获取不到就一直阻塞在take里。临时线程:可以在blockQueue.take(timeOut)带有超时时间的获取,获取不到就退出(达到了释放)基本认识private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));ctl高3位用来标记线程池状态,低29位来标原创 2021-05-13 17:41:43 · 171 阅读 · 0 评论 -
ConcurrentHashMap源码分析
目录重要的属性sizeCtl重要的内部类初始化方法initTableConcurrentHashMap.transfer()扩容ConcurrentHashMap.put()ConcurrentHashMap.get()ConcurrentHashMap.size()ConcurrentHashMap与同是线程安全的老大哥HashTable相比,它已经更胜一筹,因此它的锁更加细化,而不是像HashTable一样为几乎每个方法都添加了synchronized锁,这样的锁无疑会.原创 2021-05-12 21:02:05 · 357 阅读 · 3 评论 -
Unsafe大致了解
https://www.cnblogs.com/mickole/articles/3757278.htmlJava中Unsafe类详解java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作,主要提供了以下功能:1、通过Unsafe类可以分配内存,可以释放内存:类中提供的3个本地方法allocateMemory、reallocateMemory、freeMemory分别用于分配内存,扩充内存和释放内存,与C语言中的3个方法对应。2、可以定位对象某字转载 2020-08-13 21:17:51 · 245 阅读 · 0 评论 -
ConcurrentLinkedQueue源码分析
并编程中,一般需要用到安全的队列,如果要自己实现安全队列,可以使用2种方式:方式1:加锁,这种实现方式就是我们常说的阻塞队列。方式2:使用循环CAS算法实现,这种方式实现队列称之为非阻塞队列。从点到面, 下面我们来看下非阻塞队列经典实现类:ConcurrentLinkedQueue (JDK1.8版)ConcurrentLinkedQueue 是一个基于链接节点的无界线程安全的队列,按照先进先出原则对元素进行排序。新元素从队列尾部插入,而获取队列元素,则需要从队列头部获取...原创 2021-05-14 18:55:39 · 570 阅读 · 1 评论 -
ReadWriteLock原理
ReentrantReadWriteLock重入读写锁:实现了ReadWriteLock接口,ReadWriteLock.readLock()需要返回读锁,ReadWriteLock.writeLock()需要返回写锁内部类:Sync(又分为FailSync和NonFairSync) ,ReadLock(里面又有一个Sync类变量), WriteLock(里面又有一个Sync类...原创 2020-08-08 17:59:47 · 611 阅读 · 0 评论 -
ReentrantLock加锁(lock())、释放锁(unlock())的实现
目录1、lock()过程总结2、 unLock()过程总结3、lock()源码分析1、抢占锁源码TryAquire():分析2、队列形成及阻塞源码分析1、形成队列过程2、形成队列阻塞的过程4、unLock()源码分析1、lock()过程总结lock()关键代码:public final void acquire(int arg) { ...原创 2020-04-08 20:30:14 · 1406 阅读 · 0 评论 -
ReentrantLock加锁(lock())、释放锁(unlock())的实现
ReentrantLock加锁(lock())、释放锁(unlock())的实现丑星星关注0.0512017.05.03 15:59:31字数 4,627阅读 3,641一、简介ReentrantLock是JUC包下比较重要同样也是比较常用的一个类,从类名可以看出它的功能:Lock是锁,reentrant可重入,可重入锁。在功能上ReentrantLock和synchroniz...转载 2020-04-08 11:47:09 · 1453 阅读 · 0 评论 -
Java的LockSupport的park和unpark的基本使用,以及对线程中断的响应性
park和unpark基本介绍LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语。LockSupport实际上是调用了Unsafe类里的函数,归结到Unsafe里,只有两个函数: public native void unpark(Thread jthread); public native void park(boolean isA...转载 2020-04-01 21:58:19 · 546 阅读 · 0 评论 -
线程基本操作
1.Thread joint1.join作用就是等t1运行完,主线程才会继续往下执行public class MyThread1 extends Thread { @Override public void run() { try { TimeUnit.MICROSECONDS.sleep(1000); Sy...原创 2020-02-13 15:49:43 · 220 阅读 · 0 评论 -
线程安全性问题
线程安全的源头问题1.可见性cpu增加了高速缓存,均衡与内存的速度差异,这使得多个线程拿到共享资源后,分别在不同的cpu上执行,每个cpu都拥有自己的高速缓存,每个线程在不同的高速缓存里,互相之间并不可见,如:俩个线程同时拿到i=0,第一个线程在自己的缓存里写i=1,第二个线程并不知道2.原子性初始i=0 i++实际上分3步操作,1.获取值2.加一3.写回内存这使得第一个线程...原创 2020-02-14 19:10:49 · 325 阅读 · 0 评论 -
三种创建线程的方法
目录实现Runnable接口继承Thread通过FuturerTask和Callable实现Runnable接口 public static void main(String[] args) { for (int i = 0; i < 100; i++) { new Thread(new Runnable() {//...原创 2019-12-01 17:13:10 · 262 阅读 · 0 评论