集合源码+JUC源码
文章平均质量分 72
就只是源码
天上飞的云传奇
一个年轻人
展开
-
实现一个简单的线程池,简单测试可跑通
主要是按照ThreadPoolExecutor的执行流程实现的。实现功能,线程池中线程数 小于 corePoolSize 则直接创建一个线程执行任务。大于则阻塞到阻塞队列。阻塞队列满了 则创建非核心线程执行任务,此时会先执行阻塞队列放不下的那个任务,之后就是超时获取阻塞队列中的任务。非核心线程的超时自动销毁。package ThreeYue;import java.util.concurrent.*;import java.util.concurrent.atomic.AtomicIn原创 2022-03-15 17:35:31 · 343 阅读 · 0 评论 -
自己实现一个阻塞队列 模仿ArrayBlockingQueue
通过条件队列的等待通知模式来实现 一个基于数组的 有限的阻塞队列package ThreeYue;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;/** * 一个阻塞的FIFO队列 * @param <E> */public class MyBlockingQueue<E> { private ReentrantLock原创 2022-03-11 16:51:28 · 187 阅读 · 0 评论 -
submit()和execute()区别原理 通过源代码的区别
之前的一篇线程池 submit()执行怎么获取到的返回值只是讲了怎么使用,还有一部分源码。这篇具体从 提交任务,到具体怎么 传入Runnable 会可以有返回值?并且还涉及线程池中线程怎么执行任务?概念级的区别可以看之前的文章。从submit构造方法开始submit()的出现在ExecutorService,具体实现是它的实现类AbstractExecutorService有三个构造方法<T> Future<T> submit(Callable<T> task原创 2022-02-28 13:01:08 · 145 阅读 · 0 评论 -
线程池 submit()执行怎么获取到的返回值
Java创建线程有三种方法,1是继承Thread类,2是实现Runnable接口,3是实现Callable接口1和2差不多,就是一个是继承关系,继承了Thread类就不能继承其它类的,会有困扰。而实现接口却可实现多个。而且继承Thread类去实现的run方法实际还是Runnable中的run方法前提执行submit()方法会返回一个Future。这个future.get()可以阻塞获取值demo- 21-40 行是创建一个线程池,重点关注42,49,57代码快package study4;i原创 2021-12-19 17:26:40 · 3685 阅读 · 0 评论 -
HashMap && HashTable && synchronizedMap&& ConcurrentHashMap 面试常问题
HashMap && HashTable && synchronizedMap&& ConcurrentHashMap 面试常问题开始Collections.synchronizedMap()HashMap是线程不安全的,那么怎么解决线程不安全呢?使用HashTable 代替使用Collections.synchronizedMap() 代替使用ConcurrentHashMap 代替但是,最好用ConcurrentHashMap。原创 2021-11-18 21:02:51 · 561 阅读 · 0 评论 -
Java单例模式
单例模式Java多线程程序中,有时候需要延迟对象的初始化,降低初始化类和创建对象的开销。而单例模式就提供了这种解决方法。在单例模式中,只允许一个类创建一个对象。所以不能让外部提供构造方法创建它,于是就private SingleDemo(){}且只提供一个对象,则用一个公共方法来获取这一个对象。单例模式有饿汉式,和懒汉式。饿汉式,缺点是提前就进行了对象初始化,资源的浪费,等到需要的时候再初始化,要延迟初始化。但是这也不是一个缺点,如果这个实例初始化耗时很长,我们可以再系统上线前就知道,不用等到原创 2021-11-17 18:05:52 · 486 阅读 · 0 评论 -
【JUC】 ThreadLocal原理+内存泄漏问题
ThreadLocalThreadLocal是一个线程内部的存储器,存放的元素只能线程自身访问,其余线程访问不了。与Synchronized的比较Synchronized,是依赖与锁机制,在并发情况下,只让一个线程访问共享的变量或者代码块。而ThreadLocal则是为每个线程提供一个变量的副本,使得每个线程在访问的时候访问的都不是同一个对象。应用场景每个线程都要有一个独享的对象,通常是一个工具类。SimpleDateFormat、Random需求:10个线程打印1000个时间,由一个Sim原创 2021-11-14 20:28:21 · 825 阅读 · 0 评论 -
两线程交替打印1--200 (多种实现+错误代码分析)
两线程交替打印1–200阅读必须了解sychronized的等待通知模式,ReetrantLock的Condition队列。volatile修饰符Semaphore信号量1.使用volatile变量做信号量不使用锁,使用一个volatile变量和AtomicInteger(这个不是必要)import java.util.concurrent.atomic.AtomicInteger;public class TwoThread{ static AtomicInteger num原创 2021-11-07 22:04:48 · 581 阅读 · 0 评论 -
[JUC] 线程池实现原理,ThreadPoolExecutor 源码分析
[JUC] 线程池实现原理,ThreadPoolExecutor 源码分析第一天,了解基础1.线程池是什么?线程池,是一种管理多个线程的工具。常见的有,Mysql 数据库连接池。线程的创建和销毁是会带来额外的开销,并且过多的线程也会让系统承受不住。所以,线程池就是用来解决这两个问题。1.线程池会保持一定数目的核心线程一直存活。这样任务可以及时的处理,也不会有创建带来的开销。2.线程池也会管理线程,过多的任务会进入线程池的阻塞队列中,并不会立即创建线程。使用线程池带来的好处:降低资源的消耗,重复原创 2021-10-24 20:21:17 · 159 阅读 · 0 评论 -
线程池基本内容和简单使用
线程池基本内容和简单使用基本内容构造方法参数public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable&g原创 2021-10-10 14:33:13 · 85 阅读 · 0 评论 -
Semaphore (控制并发线程数)【信号量】
Semaphore (控制并发线程数)【信号量】主要方法:acquire()拿到许可证,release返回应用场景:数据库连接,假设有几万个文件需要读取,我们可以启动几十个线程并发的读取。但是,读到内存后还需要存储到数据库,此时数据库连接只有10个,我们可以使用semaphore控制线程持有数据库连接,同时只有十个线程获取数据库连接。使用demopackage com.w.juc;import java.util.concurrent.Semaphore;public class Semap原创 2021-10-03 17:36:31 · 253 阅读 · 0 评论 -
CyclicBarrier(同步屏障)
CyclicBarrier(同步屏障)应用场景:一个等多个,当一组线程到达一个屏障,调用awaite,告诉CyclicBarrier我已经到了,然后当前线程会被阻塞,当最后一个线程到达时就会开始执行。下面demo,模拟三个人到达5道门的情景,每次都必须所有人都到一道门才能去下一道门。使用demopackage com.w.juc;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.Cycli原创 2021-10-03 16:50:57 · 101 阅读 · 0 评论 -
CountDownlatch(等待多线程完成)
CountDownlatch(等待多线程完成)应用场景:主线程等待其它线程的结束,比如运动员和裁判,所有运动员准备好后,裁判发令,所有运动员到终点后,裁判提示比赛结束。有awaite,和countDown方法使用demopackage com.w.juc;import java.util.concurrent.CountDownLatch;public class CountDownLatchDemo implements Runnable{ private static CountDo原创 2021-10-03 16:50:18 · 402 阅读 · 0 评论 -
Synchronized底层原理
Synchronized底层原理synchronized语义是由jvm去实现的对于修饰方法jvm是基于进入和退出monitor。在方法的方法常量池中有一个标记量ACC_SYNCHRONIZED,当是同步方法时jvm读取该标记量,为真就指示去获取monitor。当方法退出的时候,释放monitor。对于修饰代码块jvm也是基于进入和退出monitor的,在代码块开始的地方插入monitorenter,结束的地方插入monitorexit。或者是异常处。jvm保证每个monitorenter都有与之对原创 2021-09-29 16:03:53 · 124 阅读 · 0 评论 -
Synchronized使用方式
Synchronized使用方式demo1package com.w.juc;public class SynchronizedDemo { static int value; public static void increment() { for (int i = 0; i <10000; i++) { value++; } } public static void main(String[]原创 2021-09-27 19:19:48 · 176 阅读 · 0 评论 -
【AQS】LockSupport工具、Condotion接口
【AQS】LockSupport工具、Condotion接口LockSupport: 有一组静态方法,给AQS提供了最基本的阻塞和唤醒功能方法描述: park有停车意思,假设当前线程为车辆,阻塞就是停车。park() 阻塞当前线程,如果调用upoark()或者当前线程被中断才能从park()返回parkNanos(long) 超时返回,参数是纳秒,在park基础上增加了时限parkUntil(long deadline) 参数是(从1970年开始到当前时间的毫秒数) pu原创 2021-09-22 20:01:12 · 144 阅读 · 0 评论 -
重入锁&读写锁原理分析笔记
重入锁&读写锁原理分析笔记ReentrantLock可重入锁支持一个线程多次(重入)获取锁,当前线程可不进行unlock(),再一次lock()锁的公平非公平,如果再一个绝对时间上,可以按照先请求锁的线程先获取到,那么就是公平的。反之,是非公平任何实现重入锁(排它锁)ReentrantLock默认是非公平锁,以此解析//这个是继承了Sync类的NonfairSync实现的方法final void lock() {//先去判断当前同步状态,是0则表示获取成功并修改状态为1,否则就会去调用原创 2021-09-21 16:48:32 · 191 阅读 · 0 评论 -
AQS(AbstractQueuedSynchronizer)队列同步器原理笔记
ASQ(AbstractQueuedSynchronizer)队列同步器原理笔记我只是记录下我的学习,详细仔细学习可以去看Java并发编程的艺术AQS使用使用一个int成员变量表示同步状态使用一个FIFO双向队列,作为同步等待队列。同步器是实现锁的关键。锁聚合了同步器,这样可以抽出共有的代码逻辑,解耦。两者的区别在于,同步器是面向锁的实现者的,想要实现一个锁,使用同步器可以方便开发,因为他提供了如何管理同步状态,线程的排队,等待和唤醒等底层操作。锁是提供给使用者的,提供给使用者与锁交互原创 2021-09-20 15:58:42 · 177 阅读 · 0 评论 -
Atomic原理+问题
Atomic原理+问题问题:什么是Atomic?Atomic包下的原子类,是不可中断的一系列操作,保证了多线程下的安全性。原子类是使用volatile和cas操作来保证原子性的,并不是锁原子类有哪些?1.基本类型的原子类(3) AtomicInteger、AtomicLong、AtomicBoolean2.数组类型原子类(3) AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray<E>3.引用类型(1) At原创 2021-09-18 21:49:34 · 384 阅读 · 0 评论 -
HashMap常用方法流程图
HashMap初始化&put流程get流程remove流程原创 2021-09-17 16:23:34 · 195 阅读 · 0 评论 -
List 各个实现类使用流程图
ArrayLsitnew 一个ArrayList初始化数组就是在grow()扩容方法时候 ,调用Arrays.copyOf()方法,使用无参构造则返回一个大小为16的数组add流程只要添加一个元素就会改变迭代器计数器modCount++。也就是则迭代器遍历时,添加一个元素会导致迭代器快速失效get流程remove流程这里也会改变modCount++LinkedList 双向链表new LinkedList这个就是一个空的构造器add流程...原创 2021-09-17 14:00:03 · 249 阅读 · 0 评论 -
HashSet+LinkedHashSet源代码 JDK1.8
HashSet+LinkedHashSet源代码 JDK1.8HashSet一贯首先看类关系图,发现居然没有HashMap,不是说HashSet底层是HashMap吗,我一度认为是和LinkedHashMap一样的。说明两个概念,在 Java 中,要基于基础类进行创新实现有两个概念继承基础类,覆写基础类的方法,比如说继承 HashMap , 覆写其put的方法组合基础类,通过调用基础类的方法,来复用基础类的能力LinkedHashMap是继承了HashMap,而HashSet是组合了原创 2021-09-16 15:29:46 · 75 阅读 · 0 评论 -
LinkedHashMap源码 JDK1.8
LinkedHashMap源码 JDK1.8第一步就是看看类继承实现图。它继承了HashMap,这就意为着拥有了和HashMap一样的特性。底层是HashMap的散列表+双向链表。多出来的双向链表带来了新的特性:可以保证插入的顺序,插入是a-》b-》c 遍历输出也是a-》b-》c提供了LRU策略,最近最少使用。在这里是将访问元素之后将该元素插入到链表的末尾,这样操作下来头结点就是最近最少访问的元素结构//属性//双向链表头尾指针transient LinkedHashMap.Entry原创 2021-09-12 17:16:59 · 75 阅读 · 0 评论 -
HashMap相关问题
HashMap相关问题1.HashMap 底层数据结构是什么?HashMap 是由一个数组+若干链表/红黑树组成的1.数组是为了方便查找,通过下标查找,时间复杂度为O(1),下标的计算是计算key的hashcode 然后通过求余算法找到下标。2.数组元素是Node,当元素的key经过hashcode之后计算出的下标一致时,就会转化为一条链表,时间复杂度为O(n)3.当链表元素>=8,hashmap总元素>=64时就会转化为红黑树,时间复杂度是O(logn)2.为解决 hash 冲突原创 2021-09-11 20:59:44 · 88 阅读 · 0 评论 -
ArrayList常见问题
ArrayList常见问题1、ArrayList是什么?可以用来干嘛? ArrayList是一个可以动态扩容的存储结构。底层是一个Object类型数组。可以用来按照顺序存放数据。是Object类型可以存放任意类型的数据,如果是自定义类型必须重写equals方法,要不然remove(Object o)方法【通过值删除】无法正常使用,或者是indexOf(Object o)等方法 而且我们装载基本类型 int byte double float short boolean long char 只能使用他们原创 2021-09-09 21:18:25 · 306 阅读 · 0 评论 -
看完ArrayList源代码之后再看关于ArrayList的问题
之前写的一个源码笔记 分析了结构和一些常用方法,看完就对扩容啥的清楚了许多问题我一个学长写的博客,对看源代码之后深入理解有很大帮助【Java容器源码】关于 ArrayList 的几个问题add 方法的过程是……先进行容量判断ensureCapacityInternal(size + 1);在这个方法里面就有第一次add怎么空参构造出的ArrayList容量就变成了默认大小10的原因//通过空参构造,底层Object[]数组选择的是 DEFAULTCAPACITY_EMPTY_ELEMENTDAT原创 2021-08-10 10:20:59 · 87 阅读 · 0 评论 -
HashMap源码----JDK1.8
HashMap源码----JDK1.8类注释:基于hash表结构实现,hash表结构: 大小为16的数组内元素为一条链表可以放入空值,还可以放入空键(之前还以为只能是空值),空键怎么得到hoshcode值?(在hash方法中进行了key为null的处理,返回值为0) 放到hash表的哪里?放到数组索引为0的地方 第一个桶Hashtable这个是一个线程安全的HashMap,现在不常用或者不用,不允许空值,更多的使用JUC包下的CurrentHashMap,或者Collections.syn原创 2021-08-18 15:10:35 · 208 阅读 · 0 评论 -
LinkedList源码笔记 ---- JDK1.8
目录LinkedList源码笔记 ---- JDK1.8结构常用方法(我还不常用这个类。。。)增加元素删除元素查找元素修改元素迭代器结构方法队列LinkedList源码笔记 ---- JDK1.8LinkedList是双向列表增删效率比较高,且可以放null值不需要初始化容量,可以ctrl+alt+shift+u查看类的关系图结构继承了AbstractSequentialList父类此类有着操作list的基本方法同样和ArrayList一样实现了Cloneable 可以对象拷贝调用Ob原创 2021-08-08 20:18:50 · 173 阅读 · 0 评论 -
String类源码笔记----JDK1.8
String类源码笔记----JDK1.8简介:String类是Java中指代字符串的类,字符串创建后不可修改(由final修饰)。 String str = "abc";相当于 char data[] = {'a', 'b', 'c'}; String str = new String(data);结构类的私有属性//存储每个字符,final修饰,此数组第一次赋值后不可变。//1.final修饰会被JVM缓存(还没学JVM)//2.在多线程下安全,可共享private fin原创 2021-08-04 19:53:44 · 249 阅读 · 0 评论 -
包装类缓存池 ----JDK1.8
包装类缓存池 ----JDK1.8本文以Integer为例 (看了Long的分析之后)结构类的结构public final class Integer extends Number implements Comparable<Integer> 继承了Number类Number类定义了很多由当前包装类转为基本类型的方法,每个包装类都继承该方法并实现//实现了Comparable接口的compareTo方法public int compareTo(Integer anothe原创 2021-08-05 12:45:41 · 183 阅读 · 1 评论 -
ArrayList源码笔记 ---- JDK1.8
目录ArrayList源码笔记 ---- JDK1.8结构常用方法 --增删改查迭代器ArrayList源码笔记 ---- JDK1.8结构父类和接口public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable //分析: 继承了AbstractList,可以原创 2021-08-06 21:40:37 · 161 阅读 · 0 评论