高并发
文章平均质量分 95
安心撸码
这个作者很懒,什么都没留下…
展开
-
并发包下原子类
概览原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换。原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割而只执行其中的一部分,将整个操作视作一个整体是原子性的核心特征。在java中提供了很多原子类,笔者在此主要把这些原子类分成四大类。原子更新基本类型相关实现类:Atomi...原创 2019-10-28 17:53:32 · 318 阅读 · 0 评论 -
深入源码分析 Java 线程池实现原理
池化技术池化技术简单点来说,就是提前保存大量的资源,以备不时之需。在机器资源有限的情况下,使用池化技术可以大大的提高资源的利用率,提升性能等。在编程领域,比较典型的池化技术有:线程池、连接池、内存池、对象池等。本文主要来介绍一下其中比较简单的线程池的实现原理,希望读者们可以举一反三,通过对线程池的理解,学习并掌握所有编程中池化技术的底层原理。创建一个线程在Ja...转载 2019-10-22 22:00:23 · 139 阅读 · 0 评论 -
AQS的实现原理
AbstractQueuedSynchronized(AQS),抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch...。我们以ReentrantLock作为讲解切入点。1. ReentrantLock的调用过程ReentrantLock把所有Lock接口的操作...原创 2019-10-20 15:03:16 · 677 阅读 · 0 评论 -
JAVA闭锁CountDownLatch详解
闭锁闭锁是一种同步工具类,可以延迟线程的进度直到其到达终止状态。闭锁的作用相当于一扇门:在闭锁到达结束状态之前,这扇门一直是关闭的,并且没有任何线程能够通过,当到达结束状态时,这扇门会打来并允许所有的线程通过。当闭锁到达结束状态后,将不会再改变状态,因此这扇门将永远保持打开状态。闭锁可以用来确保某些活动直到其他活动都完成后才继续执行,例如:确保某个计算在其需要的所有资源都被初始化之后才继续...原创 2019-07-23 12:48:57 · 163 阅读 · 0 评论 -
多线程拓展--谷歌ListeningExecutorService的使用
由于普通的线程池,返回的Future,功能比较单一;Guava 定义了 ListenableFuture接口并继承了JDK concurrent包下的Future 接口,ListenableFuture 允许你注册回调方法(callbacks),在运算(多线程执行)完成的时候进行调用。1.使用方法如下:1.创建线程池2.装饰线程池3.任务处理4.回调函数处理5.所有任务完成...原创 2019-07-28 11:27:57 · 2144 阅读 · 0 评论 -
多线程--优先队列PriorityBlockingQueue
简介PriorityBlockingQueue是一个支持优先级的无界阻塞队列。默认情况下元素采用自然顺序升序排列。也可以自定义类实现compareTo()方法来指定元素排序规则,或者初始化PriorityBlockingQueue时,指定构造参数Comparator来对元素进行排序。但需要注意的是不能保证同优先级元素的顺序。和ArrayBlockingQueue一样内部使用数组实现,插入和...原创 2019-07-28 11:38:24 · 556 阅读 · 0 评论 -
Fork/Join框架学习
1. 概述ava.util.concurrent.ForkJoinPool由Java大师Doug Lea主持编写,它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。本文中对Fork/Join框架的讲解,基于JDK1.8+中的Fork/Join框架实现,参考的Fork/Join框架主要源代码也基于JDK1.8+。2. 常用方法F...原创 2019-08-01 21:00:19 · 139 阅读 · 0 评论 -
并发编程--并发容器的原理,7大并发容器详解、及使用场景
1.什么是同步容器Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map,大家熟知的这些集合类ArrayList、LinkedList、HashMap这些容器都是非线程安全的。如果有多个线程并发地访问这些容器时,就会出现问题。因此,在编写程序时,在多线程环境下必须要求程序员手动地在任何访问到这些容器的地方进行同步处理,这样导致在使用这些容器的时候非常地不方便。所...原创 2019-07-31 22:58:35 · 193 阅读 · 0 评论 -
并发编程--Synchronized同步锁的底层实现
Synchronizedsynchronized 翻译为中文的意思是同步,也称之为”同步锁“。synchronized的作用是保证在同一时刻,被修饰的代码块或方法只会有一个线程执行,以达到保证并发安全的效果。Synchronized的使用1.synchronized的3种使用方式修饰实例方法:作用于当前实例加锁 修饰静态方法:作用于当前类对象加锁 修饰代码块:指定加...原创 2019-07-31 22:53:01 · 389 阅读 · 0 评论 -
Java并发编程:volatile关键字解析
1.volatile关键字的两层语义 一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。 2)禁止进行指令重排序。 先看一段代码,假如线程1先执行,线程2后执行://线程1boolean stop = f...原创 2019-07-23 10:33:45 · 80 阅读 · 0 评论 -
Java并发编程-Callable、Future和FutureTask
一、Callable 与 Runnablejava.lang.Runnable,它是一个接口,在它里面只声明了一个run()方法:public interface Runnable { public abstract void run();}由于run()方法返回值为void类型,所以在执行完任务之后无法返回任何结果。Callable位于java.util.concur...原创 2019-07-15 09:17:19 · 124 阅读 · 0 评论 -
并发编程--ReentrantReadWriteLock源码解析
ReentrantReadWriteLock是Lock的另一种实现方式,我们已经知道了ReentrantLock是一个排他锁,同一时间只允许一个线程访问,而ReentrantReadWriteLock允许多个读线程同时访问,但不允许写线程和读线程、写线程和写线程同时访问。相对于排他锁,提高了并发性。在实际应用中,大部分情况下对共享数据(如缓存)的访问都是读操作远多于写操作,这时ReentrantR...原创 2019-11-02 20:35:31 · 194 阅读 · 0 评论 -
并发编程--JDK8新增锁StampedLock详解
问题如果读取执行情况很多,写入很少的情况下,使用 ReentrantReadWriteLock 可能会使写入线程遭遇饥饿(Starvation)问题,也就是写入线程迟迟无法竞争到锁定而一直处于等待状态。2 StampedLock控制锁有三种模式(写,读,乐观读),一个StampedLock状态是由版本和模式两个部分组成,锁获取方法返回一个数字作为票据stamp,它用相应的锁状态表示并控制...原创 2019-07-23 19:48:26 · 308 阅读 · 0 评论 -
并发编程--双重检查锁定与延迟初始化
在Java多线程程序中,有时候需要采用延迟初始化来降低初始化类和创建对象的开销。双重检查锁定是常见的延迟初始化技术,但它是一个错误的用法。本文将分析双重检查锁定的错误根源,以及两种线程安全的延迟初始化方案。双重检查锁定的由来?在Java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时,程序员可能会采用延迟初始化。但要正确实现线程安全的延迟...原创 2019-07-24 08:47:43 · 198 阅读 · 0 评论 -
ThreadLocal内存泄漏问题
前言ThreadLocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。但是如果滥用ThreadLocal,就可能会导致内存泄漏。下面,我们将围绕三个方面来分析ThreadLocal内存泄漏的问题ThreadLocal实现原理 ThreadLocal为什么会内存泄漏 ThreadLocal最佳...原创 2019-10-21 11:14:17 · 183 阅读 · 0 评论 -
并发编程--阻塞队列LinkedBlockingQueue与ArrayBlockingQueue
阻塞队列概要阻塞队列与我们平常接触的普通队列(LinkedList或ArrayList等)的最大不同点,在于阻塞队列支出阻塞添加和阻塞删除方法。阻塞添加所谓的阻塞添加是指当阻塞队列元素已满时,队列会阻塞加入元素的线程,直队列元素不满时才重新唤醒线程执行元素加入操作。(put方法)阻塞删除阻塞删除是指在队列元素为空时,删除队列元素的线程将被阻塞,直到队列不为空再执行删...原创 2019-07-24 19:49:41 · 190 阅读 · 0 评论 -
Synchronized原理及升级优化
Synchronized的作用:(1)确保线程互斥的访问同步代码;(2)保证共享变量的修改能够及时可见;(3)有效解决重排序问题。Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:1、普通同步方法,锁是当前实例对象;2、静态同步方法,锁是当前类的class对象;3、同步方法块,锁是括号里面的对象;Java虚拟机对synchr...转载 2019-07-21 21:30:06 · 113 阅读 · 0 评论 -
Java并发-AQS及各种Lock锁的原理
什么是AQSAQS是AbstractQueuedSynchronized的简称,它是一个Java提供的底层同步工具类,用一个int类型的变量表示同步状态,并提供了一系列的CAS操作来管理这个同步状态。AQS的主要作用是为Java中的并发同步组件提供统一的底层支持,例如ReentrantLock,CountdowLatch就是基于AQS实现的,用法是通过继承AQS实现其模版方法,然后将子类作为同...原创 2019-07-18 22:55:17 · 126 阅读 · 0 评论 -
阻塞队列
并发编程几种主要的阻塞队列阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满;从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空。并发包下很多高级同步类的实现都是基于BlockingQueue实现的。Bl...原创 2019-07-15 08:45:20 · 100 阅读 · 0 评论 -
线程池
线程池实现原理当向线程池提交一个任务之后,线程池的处理流程如下:判断是否达到核心线程数,若未达到,则直接创建新的线程处理当前传入的任务,否则进入下个流程 线程池中的工作队列是否已满,若未满,则将任务丢入工作队列中先存着等待处理,否则进入下个流程 是否达到最大线程数,若未达到,则创建新的线程处理当前传入的任务,否则交给线程池中的饱和策略进行处理。流程如下图:java中的线...原创 2019-11-02 20:35:47 · 212 阅读 · 0 评论