【并发】Java并发编程
文章平均质量分 85
IT码客
明日复明日,明日何其多,以此博文来约束自己,多学习,多总结。如不巧能帮助他人,实属本人之荣幸。
展开
-
Java 并发编程(十九):ThreadPoolExecutor
ThreadPoolExecutor源码分析简介java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类,因此如果要透彻地了解Java中的线程池,必须先了解这个类。本文就从源码着手开始一步步了解ThreadPoolExecutor类图ThreadPoolExecutor继承了AbstractExecutorService类...原创 2018-03-16 15:21:31 · 204 阅读 · 0 评论 -
Java 并发编程 (十):显示锁 Condition 接口
1、概述Condition 接口也提供了类似 Object 的监视器方法,它与 Lock 配合可以实现 等待/通知 模式,当要实现一个等待/通知模式时,我们首先想到的就是 synchronized 同步关键字,它配合 Object 的 wait()、notify() 等系列方法实现。还有一种实现方式,那就是使用显式锁 Lock ,配合 Condition 也可以实现等待/通知模式。O...原创 2019-01-01 17:57:12 · 645 阅读 · 0 评论 -
Java 并发编程(十一): Java 8 基于CAS 的ConcurrentHashMap 的实现原理
1、ConcurrentHashMap 简介ConcurrentHashMap 是一个支持完全并发检索和更新的哈希表。该类遵循了与 java.util.Hashtable 相同的功能规范,与 Hashtable 的每个方法都有相对应的版本。它的所有操作都是线程安全的,检索操作也不需要锁定,但是不支持锁定整个表。在依赖于线程安全但不依赖于其同步细节的程序中,此类可与Hashtable完全互操作。检...原创 2019-01-12 20:56:08 · 6066 阅读 · 0 评论 -
Java 并发编程(十三):并发工具 CyclicBarrier
CyclicBarrier(内存同步屏障)1、简介CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。CyclicBarrier默认的构造方法是CyclicBarrier(intparties),其参数表示屏障拦截...原创 2019-01-26 22:33:50 · 180 阅读 · 0 评论 -
Java 并发编程(十四):并发工具 Semaphore
1、概述Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源,就是控制并发线程的数量2、类图Semaphore还提供一些其他方法:int availablePermits() : 返回此信号量中当前可用的许可证数。int getQueueLength(): 返回正在等待获取许可证的线程数。boolean hasQueuedTh...原创 2019-01-27 17:20:35 · 217 阅读 · 0 评论 -
Java 并发编程(十五):并发工具 Exchanger
1、概述Exchanger(交换器)是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据, 如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方2、类图...原创 2019-01-27 17:28:32 · 185 阅读 · 0 评论 -
Java 并发编程(十六):并发工具 Phaser
1、概述CountDownLatch 和 CyclicBarrier 都是JDK 1.5引入的,而 Phaser 是JDK 1.7引入的。Phaser的功能与CountDownLatch和CyclicBarrier有部分重叠,同时也提供了更丰富的语义和更灵活的用法。CyclicBarrier,允许一组线程互相等待,直到到达某个公共屏障点。它提供的await()可以实现让所有参与者在临界点到来之...原创 2019-01-27 18:13:58 · 458 阅读 · 0 评论 -
Java 并发编程(十七):CAS的实现原理
文章目录1、简介2、背景说明2.1、CPU 与 内存的交互方式2.2、示例说明3、CAS 实现原理4、源码分析4.1、Java 原子操作类中CAS的应用4.2、openjdk 中 compareAndSwapInt 的实现5、CAS 存在的问题6、参考资料1、简介CAS 全称是 compare-and-swap ,在计算机科学中,比较和交换(CAS)是在多线程中用于实现同步的原子指令。CAS...原创 2019-03-09 20:02:01 · 536 阅读 · 0 评论 -
Java 并发编程(七): 重入锁 ReentrantLock
ReentrantLock 重入锁简介重入锁 ReentrantLock,顾名思义,就是支持同一个线程对资源的重复加锁。另外,该锁还支持获取锁时的公平与非公平性的选择。 重入锁 ReentrantLock,只支持独占方式的获取操作,因此它只实现了 tryAcquire、tryRelease 和 isHeldExclusively 方法。ReentrantLock 如何实现锁重入...原创 2018-09-16 18:37:36 · 158 阅读 · 0 评论 -
Java 并发编程 (九):显示锁LockSupport 工具
1、LockSupport 概述LockSupport 定义了一组以 park 开头的方法,用来阻塞当前线程,用 ( Thread thread) 方法来唤醒一个被阻塞的线程。每个线程都有一个许可(permit),permit 有两个值1和0,默认是0。当调用unpark(thread)方法,就会将thread线程的许可permit设置成1(多次调用unpark方法,不会累加,permit值...原创 2018-12-16 19:01:02 · 196 阅读 · 0 评论 -
Java 并发编程(八):读写锁 ReentrantReadWriteLock
1、读写锁(ReadWriteLock)简介ReentrantReadWriteLock是Lock的另一种实现方式,同一时间允许多个读线程访问,但是在写线程访问时,所有的读写线程都被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁使并发性比一般的排它锁有了很大的提升。一般情况下,读写锁的性能都会比排它锁好,因为大多场景下读操作要多于写操作。在读操作多于写操作的情况下,读写锁能够...原创 2018-12-09 19:22:50 · 620 阅读 · 0 评论 -
Java 并发编程(十二):并发工具 CountDownlatch
1. CountDownlatch(计数器)描述:一个同步工具类,允许一个或多个线程等待其它线程完成操作类图 通过指定的count值进行初始化,调用await方法的线程将被阻塞,直到count值通过countDown()方法减小到0,所有等待的线程才会被释放继续执行。另外CountDownLatch不可能重新初始化或者修改CountDownLatch对象的内部计数器...原创 2018-03-16 14:40:27 · 293 阅读 · 0 评论 -
Java 并发编程(十八):CAS的三大问题
在Java并发包中有一些并发框架也使用了自旋CAS的方式实现了原子操作,比如:LinkedTransferQueue类的Xfer方法。CAS虽然很高效的解决了原子操作,但是CAS仍然存在三大问题:ABA问题、循环时间长开销大、只能保证一个共享变量的原子操作1.ABA问题1.1.什么是ABA问题因为CAS需要在操作值得时候,检查值有没有发生变化,如果没有发生变化则更新,但是如果一...原创 2018-04-02 21:58:13 · 1207 阅读 · 0 评论 -
Java并发编程(一):线程的启动和停止
如何构造线程在运行线程之前需要先构造线程对象,线程对象的构造需要指定线程所需要的属性,比如:所属线程组、线程优先级、是否为Daemon线程等信息。下面我们看一下,java.lang.Thread中对线程初始化的方法:private void init(ThreadGroup g, Runnable target, String name, l...原创 2018-09-02 17:15:47 · 14236 阅读 · 0 评论 -
Java并发编程(二):线程优先级及守护线程
简述在操作系统中,线程是可以划分优先级的,优先级较高的线程,得到CPU优先执行的几率就较高一些。设置线程的优先级,有助于帮助线程规划期选择下一个哪一个线程优先执行,但是线程优先级高不代表一定会优先执行,这在下文会说明原因如何设置线程优先级设置线程优先级的方法是 setPriority,jdk中该方法的代码如下:public final void setPriority(in...原创 2018-09-02 17:16:33 · 276 阅读 · 0 评论 -
Java并发编程(三):synchronized的实现原理及应用
简述Java中每个对象都可以用来实现一个同步的锁,这些锁被称为内置锁(Intrinsic Lock)或监视器锁(Monitor Lock)。具体表现形式如下:1、普通同步方法,锁的是当前实例对象2、静态同步方法,锁的是当前Class对象3、对于同步代码块,锁的是Synchronized括号中的代码块线程在进入同步代码块之前会自动获取锁,并且在退出同步代码块时自动释放锁,无论...原创 2018-09-02 23:03:52 · 3248 阅读 · 1 评论 -
Java并发编程(四):volatile的实现原理
简述volatile 是轻量级的synchronized,在多线程开发中保证了共享变量的可见性。可见性就是当一个线程修改一个共享变量时,另一个线程可以读到修改的值。如果volatile变量使用恰当,它比synchronized的使用成本更低,因为它不会引起线程上下文的切换和调度。什么是volatileJava语言提供了一种稍弱的同步机制,即 volatile 变量,用来确保共享变量...原创 2018-09-09 14:46:18 · 554 阅读 · 0 评论 -
Java并发编程(五):线程间如何通信
1、简述线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能称为一个整体。 使线程之间进行通信后,在大大提高CPU利用率的同时还会使开发人员对各个线程任务在处理的过程中进行有效的把控。2、如何实现线程间通信2.1、等待(wait)/通知机制(notify)方法 wait() 说明方法wait()的作用是使当前执行的线程进行等待,wait() 方法是Obje...原创 2018-09-09 16:23:19 · 2619 阅读 · 0 评论 -
Java 并发编程(六):队列同步器AQS
1、简述锁时用来控制多个线程访问共享资源的方式,一般情况下,一个锁能够防止多个线程同时访问共享资源。但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁。在Java 5.0之前,在协调对共享对象的访问时可以使用的机制只有 synchronized 和 volatile。Java 5.0 增加了一种的新的机制:ReentrantLock。ReentrantLock并不是一种替代内置加锁的...原创 2018-09-16 17:25:20 · 232 阅读 · 0 评论 -
Java 并发编程(二十):原子操作类
文章目录1、简介2、原子更新基本类型2.1、AtomicInteger 实现原子操作的原理2.1.1、AtomicInteger 使用示例2.1.2、getAndIncrement 源码2.2、lazySet 方法是如何工作的2.2.1、简介2.2.2、好处2.2.3、如何实现2.3、compareAndSet 与 weakCompareAndSet 区别3、原子更新数组类型4、原子更新引用类型5...原创 2019-03-09 23:28:14 · 354 阅读 · 0 评论