![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程与高并发
文章平均质量分 94
乱糟
学到的都是自己的
展开
-
偏向锁的进化和废弃
偏向锁的进化和废弃原创 2022-01-05 01:33:22 · 594 阅读 · 0 评论 -
日常记录——多线程与高并发—ForkJoinPool简介、代码示例
一、ForkJoinPool简介ForkJoinPool:以拆分合并为核心的线程池,执行ForkJoinTask类型任务,两个类继承RecursiveAction(无返回值递归),RecursiveTask(有返回值递归)。ForkJoinPool中每个工作线程自己维护一个任务队列,当自己任务队列任务执行完,会从其他工作线程的任务队列取任务执行。ForkJoinPool是ExecutorService的扩展,更适合的是计算量大的任务。二、代码示例分别用迭代和ForkJoinPool 累加1-10000原创 2020-07-17 00:23:54 · 261 阅读 · 0 评论 -
日常记录——多线程与高并发—ThreadPoolExecutor源码解析
package java.util.concurrent;import java.security.AccessControlContext;import java.security.AccessController;import java.security.PrivilegedAction;import java.util.concurrent.locks.AbstractQueuedSynchronizer;import java.util.concurrent.locks.Conditio原创 2020-07-16 03:46:50 · 157 阅读 · 0 评论 -
日常记录——多线程与高并发—Executors提供的常用线程池、基于ThreadPoolExecutor自定义线程池
一、简介Executors工具类提供了四种线程池的创建分别为:newSingleThreadExecutor(单线程池)、newFixedThreadPool(固定线程池)、newCachedThreadPool(缓存线程池)、newScheduledThreadPool(周期线程池),四种线程池各有特点,分别介绍下:1.newSingleThreadExecutor:创建一个单线程的线程池,这个线程池只有一个线程在工作,线程池保证所有任务的执行顺序按照任务的提交顺序执行。public static原创 2020-07-15 01:24:14 · 133 阅读 · 0 评论 -
日常记录——多线程与高并发—ThreadPoolExecutor线程池核心参数、执行逻辑
一、简介线程池:一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。类关系图:二、ThreadPoolExecutor线程池核心参数真正创建的线程池是ThreadPoolExecutor类,ThreadPoolExecutor的构造方法: public ThreadPoolExecutor(int corePoolS原创 2020-07-14 00:20:29 · 354 阅读 · 0 评论 -
日常记录——多线程与高并发—交替打印数字与字母,交替输出1A2B3C4D...26Z
一、介绍用两个线程,一个输出字母,一个输出数字,交替输出1A2B3C4D…26Z。实现逻辑:使用控制方法,控制两个线程交替按顺序打印。二、实现代码1.synchronized+wait+notify:依赖对象的锁的原理,wait将线程放入等待池,notify唤醒锁资源竞争的线程放入锁池,在对象锁池的才有资格竞争锁资源。 static int num = 1;//从1开始 static char word = 'A';//从A开始 public static void mai原创 2020-07-13 00:55:19 · 647 阅读 · 0 评论 -
日常记录——多线程与高并发—并发容器queue的实现类ConcurrentLinkedQueue、继承接口BlockingQueue
1.ConcurrentLinkedQueue:是一个适用于高并发场景下链接节点的无界线程安全队列,基于cas支持高并发,非阻塞队列。add方法: public boolean add(E e) { return offer(e); } public boolean offer(E e) { //为空抛出异常 checkNotNull(e); //创建新节点 final Node<E> newNode = new Nod原创 2020-07-12 02:33:55 · 151 阅读 · 0 评论 -
日常记录——多线程与高并发—并发容器Map实现类Hashtable、ConcurrentHashMap、ConcurrentSkipListMap
一、简介1.Hashtable:Entry<K,V>的数组加链表结构,默认长度11,扩容因子0.75,每次扩容后长度为(之前的长度*2)+1。基于synchronized方法保证线程安全。put方法:计算索引值,判断应该放在哪个索引下,如果这个索引下有相同key,则覆盖,返回旧值,否则返回null。public synchronized V put(K key, V value) { // Make sure the value is not null if原创 2020-07-11 01:21:52 · 161 阅读 · 0 评论 -
日常记录——多线程与高并发—并发容器Set实现类CopyOnWriteArraySet和ConcurrentSkipListSet
一、简介1.CopyOnWriteArraySet:一个基于ReentrantLock锁的线程安全的set接口实现类。内部实际使用CopyOnWriteArrayList,底层同样是数组结构。add方法:在add前先判断是否已经存在,存在返回fasle,否则复制扩展长度,然后添加到数据内。 public boolean addIfAbsent(E e) { Object[] snapshot = getArray(); return indexOf(e, snapsho原创 2020-07-10 01:44:04 · 472 阅读 · 0 评论 -
日常记录——多线程与高并发—并发容器List实现类vector和CopyOnWriteArrayList
一、简介1.vector:JDK1.0版本添加的类。继承于AbstractList,实现了List, RandomAccess, Cloneable这些接口。底层是数组结构,默认长度为10,每次扩容翻倍。Vector中的操作是线程安全的。因为大部分方法都使用synchronized修饰。例如add方法: public synchronized boolean add(E e) { modCount++; ensureCapacityHelper(elementCount原创 2020-07-08 23:57:30 · 315 阅读 · 2 评论 -
日常记录——多线程与高并发—ThreadLocal概念、原理、使用、ThreadLocal和synchronized对比
一、概念ThreadLocal:线程本地变量,以空间换时间的方式为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。可以理解为一个当前线程的map对象,key为当前ThreadLocal,value为存放的对象。二、原理1.set():ThreadLocal为当前线程存储对象方法,设置当前线程对应的线程局部变量ThreadLocal.ThreadLocalMap threadLocals的值。如果不存在则用创建一个,然后将hreadLoc原创 2020-07-07 00:07:18 · 133 阅读 · 0 评论 -
日常记录——多线程与高并发—基于ReentrantLock非公平锁的获取锁、释放锁阅读AQS源码
一、简介AQS全名AbstractQueuedSynchronizer,是构建锁和同步容器的框架。内部维护了两个队列,一个是等待队列(CHL),还有一个是条件队列(condition用的,调用await(),线程会进入条件队列,等待被唤醒,唤醒后以自旋方式获取资源或处理中断异常;调用signal(),线程会插入到等待队列,唤醒被阻塞的线程)。实现的主要逻辑依靠state锁状态和内部类Node:state:锁资源状态,为0当前锁资源未被占用,>0被占用。内部类Node:双向链表结构,内含变量、方法原创 2020-07-06 02:25:42 · 170 阅读 · 0 评论 -
日常记录——多线程与高并发—ReadWriteLock概念、原理、使用、ReadWriteLock和synchronized对比
一、概念ReadWriteLock:见词知意,读写锁。正常业务中读操作往往比写操作更多,然后用独占锁去加锁,就会造成同样的读操作,只能排队等待,业务执行效率会降低,JDK1.5之后添加了读写锁ReadWriteLock,是一个接口,提供了readLock和writeLock两种锁的操作机制,一个读锁(共享锁),一个是写锁(排它锁)。特性为:读读共享,读写互斥,写写互斥。二、原理ReadWriteLock底层也是基于AQS实现的,独占锁往往用int类型的全局变量state(0或者>0)来判断当前锁原创 2020-07-04 01:20:45 · 204 阅读 · 1 评论 -
日常记录——多线程与高并发—控制器CountDownLatch、CyclicBarrier、Phaser、Semaphore、Exchanger、LockSupport
一.概念1.CountDownLatch:计数器控制器,对初始化数量的递减直到0,允许继续运行。2.CyclicBarrier:批量控制器,当数量到达设定值,统一执行。3.Phaser:阶段控制器,分阶段执行逻辑,1阶段满足,2阶段才会开始。4.Semaphore:信号控制器,信号数量控制,获取到信号的才可以执行。5.Exchanger:只适用2个线程交换数据,基本用不到。二.使用1.CountDownLatch:public static void main(String[] args)原创 2020-07-02 23:27:45 · 227 阅读 · 0 评论 -
日常记录——多线程与高并发—ReentrantLock概念、原理、使用、ReentrantLock和synchronized比较
一、概念ReentrantLock是接口lock的实现类,实现为基于CAS+AQS(AbstractQueuedSynchronizer构建锁和同步容器的框架)的可重入锁,默认为非公平锁,可通过构造器定义为公平锁。二、原理ReentrantLock获取锁的原理:先通过CAS判断锁资源是否被占用。如果此时已经有线程占据了锁,那就加入AQS队列并且被挂起。当锁被释放之后,排在队列队首的线程会被唤醒,然后CAS再次尝试获取锁。在这个时候,如果:非公平锁:当排在队列队首获取锁资源,如果同时还有另一个线程进来原创 2020-07-02 00:04:46 · 193 阅读 · 0 评论 -
日常记录——多线程与高并发—CAS概念、原理、问题、CAS和synchronized比较
一、概念CAS:Compare and Swap(比较并且替换),jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同步的,这是一种独占锁,也是是悲观锁。jdk 11 后改为 weak Compare and Set(比较并设定,weak应该是标记为弱引用,用作GC),cas操作为cpu原语支持,不需要担心在cas过程中产生线程竞争问题。二、原理原创 2020-06-28 23:36:50 · 354 阅读 · 0 评论 -
日常记录——多线程与高并发—volatile概念、功能、原理、举例、volatile与synchronized的区别
一、概念volatile是一个特征修饰符(type specifier).volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。二、功能1.保证数据可见性2.禁止指令重排序注意:不保证原子性例如:修饰变量的++操作。三.原理1.保证数据可见性:依靠MESI(cpu的高速缓存协议),在java内存中,分为主内存和线程内存,主内存中记录变量的值,线程内存在获取变量的值时,先将值copy到自己的内存,执行本线程内操作后,再将变量值写回到主内存。线程之间的原创 2020-06-28 00:13:12 · 180 阅读 · 0 评论 -
日常记录——多线程与高并发—synchronized概念、原理、锁升级、用法、特性、注意、优化
一、概念Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍可以访问该object中的非加锁代码块。二、原理首先要明白,锁锁住的是什么:是对象,那怎么知道一个对象是否被锁住了呢,那就要从对象说起。在原创 2020-06-27 00:09:14 · 1555 阅读 · 0 评论 -
日常记录——多线程与高并发—线程状态、方法以及对象的锁池、等待池
一.Java中的线程的生命周期线程的状态转换是线程控制的基础。线程状态总的可分为五大状态:创建(NEW)、就绪(RUNNABLE)、运行(RUNNING)、阻塞(BLOCKED)、结束(DEAD)。具体展现为:1.创建(NEW):新创建了一个线程对象,并没有调用start()方法之前。2.就绪(RUNNABLE):当start()方法调用后,线程有资格运行,但还未获取到cpu资源时。线程首先进入.就绪状态。在线程运行之后从阻塞状态回来后,也返回到就绪状态。、3. 运行(RUNNING):就绪状态线原创 2020-06-26 00:35:07 · 233 阅读 · 0 评论 -
日常记录——多线程与高并发—线程概念以及创建线程的五种方式
概念进程:一个程序的运行资源。线程:进程里面最小的资源执行单元,即一个程序里不同的执行单元。纤程/协程:更牛逼的东西,轻量级线程,一个线程可以创建任意多个纤程。线程的创建方式1.继承Thread类创建一个类继承Thread类,重写run()方法,调用创建对象的start()方法,该start()方法表示先开启线程。public class Thread { public static void main(String[] args) {原创 2020-06-25 00:49:14 · 155 阅读 · 0 评论