![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 50
zdlzzdx
这个作者很懒,什么都没留下…
展开
-
Java无锁并发框架Disruptor(二)
Java无锁并发框架Disruptor(二)原创 2021-02-08 20:10:44 · 177 阅读 · 0 评论 -
Java无锁并发框架Disruptor(一)
Java无锁并发框架Disruptor(一)简介: Disruptor是一个用于在线程间通信的高效低延时的消息组件,它像个增强的队列。它是一个高性能、低延迟、使用简单的异步处理框架,或者可以认为是最快的消息框架(轻量的JMS),也可以认为是一个观察者模式实现,或者事件-监听模式的实现,直接称disruptor模式。disruptor最大特点是高性能,其LMAX架构可以获得每秒6百万订单,用1微秒的延迟获得吞吐量为100K+。Disruptor 相对于传统方式的优点:1、无锁,没有竞争2、所有访问者都原创 2021-01-31 21:15:17 · 229 阅读 · 0 评论 -
Java 并发编程之fork/join
Java 并发编程之fork/join简介: Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。Fork/Join的运行流程如下图所示:实现原理:在Java的Fork/Join框架中,它提供了两个类来帮助我们完成任务分割以及执行任务并合并结果:1、ForkJoinTask:我们要使用ForkJoin框架,必须首先创建一个ForkJoin任务。它提供在任务中执行fork()和join()操作的机制原创 2021-01-24 13:00:58 · 241 阅读 · 1 评论 -
Java并发编程之unsafe魔法类
Java并发编程之unsafe魔法类简介: Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使Java语言拥有了类似C语言指针一样操作内存空间的能力,这无疑也增加了程序发生相关指针问题的风险。在程序中过度、不正确使用Unsafe类会使得程序出错的概率变大,使得Java这种安全的语言变得不再“安全”,因此对Unsa原创 2021-01-17 12:47:05 · 85 阅读 · 0 评论 -
Java并发编程之DelayQueue
Java并发编程之DelayQueue简介: DelayQueue是带有延迟元素的线程安全队列,当非阻塞从队列中获取元素时,返回最早达到延迟时间的元素,或空(没有元素达到延迟时间)。DelayQueue的泛型参数需要实现Delayed接口,Delayed接口继承了Comparable接口,DelayQueue内部使用非线程安全的优先队列(PriorityQueue),并使用Leader/Followers模式,最小化不必要的等待时间。DelayQueue不允许包含null元素。领导者/追随者模式是多个工作原创 2021-01-10 18:18:26 · 131 阅读 · 0 评论 -
Java并发课程之PriorityBlockingQueue
Java并发课程之PriorityBlockingQueue概述: PriorityBlockingQueue是带优先级的无界阻塞队列,每次出队都返回优先级最高或者最低的元素,内部使用平衡二叉树堆实现,所以直接遍历队列元素不保证有序.在构造函数需传入comparator,用于插入元素时继续排序,若没有传入comparator,则插入的元素必须实现Comparatable接口。PriorityBlockingQueue内部有一个数组queue,用来存放队列元素,size存放元素个数.allocationSp原创 2021-01-03 20:22:43 · 123 阅读 · 0 评论 -
Java并发编程之ReentrantReadWriteLock
Java并发编程之ReentrantReadWriteLock概述: ReentrantReadWriteLock是Lock的另一种实现方式,我们已经知道了ReentrantLock是一个排他锁,同一时间只允许一个线程访问,而ReentrantReadWriteLock允许多个读线程同时访问,但不允许写线程和读线程、写线程和写线程同时访问。相对于排他锁,提高了并发性。在实际应用中,大部分情况下对共享数据(如缓存)的访问都是读操作远多于写操作,这时ReentrantReadWriteLock能够提供比排他原创 2020-12-27 21:06:07 · 85 阅读 · 0 评论 -
Java并发编程之LockSupport
Java并发编程之LockSupport简介: LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。LockSupport 提供park()和unpark()方法实现阻塞线程和解除线程阻塞,LockSupport和每个使用它的线程都与一个许可(permit)关联。permit相当于1,0的开关,默认是0,调用一次unpark就加1变成1,调用一次park会消费permit, 也就是将1变成0,同时park立即返回。再次调用park会变成block(因为permit为0了,会阻塞在这里,直到p原创 2020-12-20 10:24:35 · 116 阅读 · 1 评论 -
学习Java并发课程之AbstractQueuedSynchronized
学习Java并发课程之AbstractQueuedSynchronized简介: AbstractQueuedSynchronizer,即队列同步器。它是构建锁或者其他同步组件的基础框架(如ReentrantLock、ReentrantReadWriteLock、Semaphore等),是JUC并发包中的核心基础组件。AQS解决了实现同步器时涉及到的大量细节问题,例如获取同步状态、FIFO同步队列。基于AQS来构建同步器可以带来很多好处。它不仅能够极大地减少实现工作,而且也不必处理在多个位置上发生的竞争问原创 2020-12-13 22:22:24 · 244 阅读 · 0 评论 -
Java并发课程之happens-before规则
Java并发课程之happens-before规则简介: happens-before是JMM的核心,之所以设计happens-before,主要出于以下两个方面的因素考虑的:1)程序员的角度,JMM内存模型需要易于理解、易于编程;2)编译器和处理器的角度,编译器和处理器希望内存模型对其束缚越少越好,这样就可以根据自己的处理规则进行优化。但是这两个方面其实是相互矛盾的,因为JMM易于编程和理解就意味着对编译器和处理器的束缚就越多。double pi = 3.14; // Adoub原创 2020-12-07 00:29:40 · 134 阅读 · 0 评论 -
Java并发理论之内存模型JMM
Java并发理论之内存模型JMM简介: JMM即为JAVA 内存模型(java memory model)。Java内存模型的主要目标是定义程序中各个变量的访问规则,即在JVM中将变量存储到内存和从内存中取出变量这样的底层细节的实现规则。它其实就是JVM内部的内存数据的访问规则,线程进行共享数据读写的一种规则,在JVM内部,多线程就是根据这个规则读写数据的。注意,此处的变量与Java编程里面的变量有所不同步,它只是包含了实例字段、静态字段和构成数组对象的元素,但不包含局部变量和方法参数(局部变量和方法参数原创 2020-11-29 18:39:43 · 68 阅读 · 0 评论 -
Java并发课程之FutureTask
Java并发课程之FutureTask简介: 在Java中一般通过继承Thread类或者实现Runnable接口这两种方式来创建多线程,但是这两种方式都有个缺陷,就是不能在执行完成后获取执行的结果,因此Java 1.5之后提供了Callable和Future接口,通过它们就可以在任务执行完毕之后得到任务的执行结果。FutureTask可用于异步获取执行结果或取消执行任务的场景。通过传入Runnable或者Callable的任务给FutureTask,直接调用其run方法或者放入线程池执行,之后可以在外部原创 2020-11-22 22:14:15 · 209 阅读 · 0 评论 -
Java并发课程之ScheduledThreadPoolExecutor
Java并发课程之ScheduledThreadPoolExecutor简介: ScheduledThreadPoolExecutor继承自ThreadPoolExecutor。它主要用来在给定的延迟之后运行任务,或者定期执行任务。ScheduledThreadPoolExecutor的功能与Timer类似,但ScheduledThreadPoolExecutor功能更强大、更灵活。Timer对应的是单个后台线程,而ScheduledThreadPoolExecutor可以在构造函数中指定多个对应的后台原创 2020-11-15 20:40:00 · 798 阅读 · 0 评论 -
Java并发编程之ThreadPoolExecutor
Java并发编程之ThreadPoolExecutor引言: 合理利用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌。简介: 多线程的程序的确能发挥多核处理器的性能。虽然与进程相比,线程轻量原创 2020-11-08 20:56:09 · 76 阅读 · 0 评论 -
Java并发编程之ThreadLocal
Java并发编程之ThreadLocal引言: ThreadLocal 是 JDK底层提供的一个解决多线程并发问题的工具类,它为每个线程提供了一个本地的副本变量机制,实现了和其它线程隔离,并且这种变量只在本线程的生命周期内起作用,可以减少同一个线程内多个方法之间的公共变量传递的复杂度。简介: ThreadLocal类并不是用来解决多线程环境下的共享变量问题,而是用来提供线程内部的共享变量,在多线程环境下,可以保证各个线程之间的变量互相隔离、相互独立。在线程中,可以通过get()和set()方法来访问原创 2020-10-30 18:41:40 · 106 阅读 · 0 评论 -
Java并发编程之ConcurrentLinkedQueue
Java并发编程之ConcurrentLinkedQueue引言: 我们要实现一个线程安全的队列有两种实现方式一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环CAS的方式来实现。简介: ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部,当我们获取一个元素时,它会原创 2020-10-23 11:53:05 · 378 阅读 · 0 评论 -
Java并发编程之BlockingQueue
Java并发编程之BlockingQueue引言: 阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满;从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空。并发包下很多高级同步类的实现都是基于BlockingQueue实现的。BlockingQueue的特点如下:1、BlockingQueue队列中不能包含nul元素;原创 2020-10-18 11:58:45 · 240 阅读 · 2 评论 -
Java并发编程之CopyOnWriteArraylist
Java并发编程之CopyOnWriteArraylist引言: Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。CopyOnWrite容器非常有用,可以在非原创 2020-10-12 00:00:20 · 166 阅读 · 0 评论 -
Java并发编程之ConcurrentHashMap
Java并发编程之ConcurrentHashMap引言: 我们知道在多线程环境下使用HashMap是线程不安全的,其主要原因是在使用HashMap的时候由于扩容操作会造成死循环、数据丢失、数据覆盖这些问题,这是因为在进行扩容操作的时候会重新定位每个元素的下标,并采用头插法将元素迁移到新数组中。而头插法会将链表的顺序翻转,这也是形成死循环和数据丢失的关键点。虽然在JDK1.8中对HashMap进行了很多优化,但是在进行put操作的时候依然会存在数据覆盖问题。由此我们便引入了ConcurrentHashMa原创 2020-09-25 23:16:10 · 320 阅读 · 0 评论 -
Java并发编程之StampedLock
Java并发编程之StampedLock引言: StampedLock类是在JDK1.8时引入,是对读写锁ReentrantReadWriteLock的增强,该类提供了一些功能,优化了读锁、写锁的访问,同时使读写锁之间可以互相转换,更细粒度控制并发。ReentrantReadWriteLock使得多个读线程同时持有读锁(只要写锁未被占用),而写锁是独占的。但是,读写锁如果使用不当,很容易产生“饥饿”问题。比如在读线程非常多,写线程很少的情况下,很容易导致写线程“饥饿”,虽然使用“公平”策略可以一定程度上缓原创 2020-09-19 22:12:53 · 307 阅读 · 0 评论 -
Java并发编程之Condition机制
Java并发编程之Condition机制**引言:**Condition存在于Concurrent包中,主要用于替代以前对象Object上的wait()、notify()等方法实现线程间的协作。相比wait()、notify(),Condition根据和Lock的结合,可以实现更复杂和精细的线程协同和等待。从整体上来看Object的wait和notify/notifyAll是与对象监视器配合完成线程间的等待/通知机制,而Condition是与Lock配合完成等待通知机制,前者是java底层级别的,后者是语原创 2020-09-12 00:23:36 · 486 阅读 · 0 评论 -
Java并发编程之Exchanger
Java并发编程之ExchangerExchanger简介: Exchanger类是JDK5中的一个并发工具辅助类,这个类的主要作用是在两个线程之间进行数据交换,它的作用是找到一个同步点,当两个线程都执行到了同步点(exchange方法)之后(有一个没有执行到就一直等待,也可以设置等待超时时间),就将自身线程的数据与对方交换,可简单地将Exchanger对象理解为一个包含两个格子的容器,通过exchanger方法可以向两个格子中填充信息。当两个格子中的均被填充时,该对象会自动将两个格子的信息交换,然后返回原创 2020-09-05 08:43:55 · 211 阅读 · 0 评论 -
Java并发编程之Semaphore
Java并发编程之Semaphore**Semaphore简介:**在多线程环境下用于协调各个线程, 以保证它们能够正确、合理的使用公共资源。信号量维护了一个许可集,我们在初始化Semaphore时需要为这个许可集传入一个数量值,该数量值代表同一时间能访问共享资源的线程数量。线程可以通过acquire()方法获取到一个许可,然后对共享资源进行操作,如果许可集已分配完了,那么线程将进入等待状态,直到其他线程释放许可后等待的线程才有机会再获取许可,线程释放一个许可通过release()方法完成。Semapho原创 2020-08-30 00:25:08 · 257 阅读 · 0 评论 -
Java并发编程之CyclicBarrier
Java并发编程之CyclicBarrier**CyclicBarrier简介:**CyclicBarrier翻译成中文是可循环使用的屏障。它与互斥量、读写锁、自旋锁不同,它不是用来保护临界区的。相反,它跟条件变量一样,是用来协同多线程一起工作的。条件变量是多线程间传递状态的改变来达到协同工作的效果。CyclicBarrier可以使一定数量的线程反复地在栅栏位置处汇集。当线程到达栅栏位置时将调用await方法,这个方法将阻塞直到所有线程都到达栅栏位置。如果所有线程都到达栅栏位置,那么栅栏将打开,此时所有的原创 2020-08-22 12:37:37 · 249 阅读 · 0 评论 -
Java并发编程之CountDownLatch
Java并发编程之CountDownLatch**CountDownLatch简介:**countdownlatch是在jdk1.5时被引入,存在于java.util.cucurrent包下,被同时引入的 voncurrentHashMap和BlockingQueue。countDownLatch用来使一个线程等待其他线程各自执行完毕后再执行。内部是通过维护一个volatile修饰的一个关键字来实现的,其值表示线程的数量,当一个线程执行完毕后,该变量值就自动减1,只有当该值为0时,代表所有线程都已执行完原创 2020-08-16 21:59:40 · 222 阅读 · 0 评论 -
Java多线程偏向锁,轻量级锁,公平锁和非公平锁
Java多线程偏向锁,轻量级锁,公平锁和非公平锁,互斥锁和共享锁**前期知识储备:**在分析以下各种锁之前我们需要了解Java对象结构与对象头中的MarkWord标记字。1、Java对象存在于堆内存当中,一个对象包括对象头,对象体,以及对齐字节。如下图所示。对象的几个部分的作用:1.对象头中的Mark Word(标记字)主要用来表示对象的线程锁状态,另外还可以用来配合GC、存放该对象的hashCode;2.Klass Word是一个指向方法区中Class信息的指针,意味着该对象可随时知道自己是原创 2020-08-09 16:52:50 · 735 阅读 · 0 评论 -
Java进阶之深入理解synchronized
Java进阶之深入理解synchronized**首先区别进程和线程的概念进程:进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。进程是一种抽象的概念,从来没有统一的标准定义。进程一般由程序,数据集合和进程控制块三部分组成。程序用于描述进程要完成的功能,是控制进程执行的指令集;数据集合是程序在执行时所需要的数据和工作区;程序控制块包含进程的描述信息和控制信息是进程存在的唯一标志。进程具有的特征:**动态性:**进程原创 2020-07-31 18:25:43 · 149 阅读 · 0 评论