![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java并发编程
fxkcsdn
学习要有一定的广度才能触发深度学习的兴趣,有兴趣再去深度学习,否则达不到真正的深度
展开
-
【Java并发编程】volatile关键字解析
个人总结:并发编程和可见性、原子性和有序性有关。volatile解决的是可见性和有序性,volatile加上原子性解决缓存一致性问题,所谓的线程安全,就是多线程运算结果的正确性。比如volatile int i=i+1,这就不是线程安全的,他不是原子性的,这个语句分为3个命令,先获取i的值,然后加1运算,最后进行赋值,那假如i初始值为0,线程A在执行这条语句的时候,在获取i值从主存加载到工作内...转载 2018-08-31 19:50:46 · 124 阅读 · 0 评论 -
【Java并发编程】Java的LockSupport的park和unpark的基本使用,以及对线程中断的响应性
LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语。LockSupport实际上是调用了Unsafe类里的函数,归结到Unsafe里,只有两个函数: public native void unpark(Thread jthread); public native void park(boolean isAbsolute, long tim...原创 2018-08-26 17:42:24 · 1440 阅读 · 0 评论 -
【Java并发编程】ReentrantReadWriteLock源码及实现原理分析
继承关系ReadLock和WriteLock是ReentrantReadWriteLock的两个内部类,Lock的上锁和释放锁都是通过AQS来实现的。AQS定义了独占模式的acquire()和release()方法,共享模式的acquireShared()和releaseShared()方法.还定义了抽象方法tryAcquire()、tryAcquiredShared()、tryR...原创 2018-08-30 17:28:36 · 14504 阅读 · 6 评论 -
【Java并发编程】深入学习 FutureTask
第一部分:What在Java中一般通过继承Thread类或者实现Runnable接口这两种方式来创建多线程,但是这两种方式都有个缺陷,就是不能在执行完成后获取执行的结果,因此Java 1.5之后提供了Callable和Future接口,通过它们就可以在任务执行完毕之后得到任务的执行结果。本文会简要的介绍使用方法,然后会从源代码角度分析下具体的实现原理。本文以Java 1.7的代码进行分析。...转载 2018-09-02 15:43:04 · 2350 阅读 · 0 评论 -
【Java并发编程】多线程面试
转载地址:https://www.cnblogs.com/aspirant/p/6920418.html1、什么是线程池: java.util.concurrent.Executors提供了一个 java.util.concurrent.Executor接口的实现用于创建线程池多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。...转载 2018-09-04 19:21:46 · 128 阅读 · 0 评论 -
【Java并发编程】双重检查问题和解决方案
双重检查的由来在Java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时,程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出现问题。比如,下面是非线程安全的延迟初始化对象的示例代码。public class UnsafeLazyInitialization { private static Ins...原创 2019-01-16 11:41:54 · 889 阅读 · 0 评论 -
【Java并发编程】详细分析AQS原理之独占锁
AQS(队列同步器),是用来构建锁或者其他同步组件的基础框架,它实现了同步状态的管理,线程的排队,等待与唤醒等底层操作。AQS定义两种资源访问方式:Exclusive(独占,只有一个线程能执行,如ReentrantLock)和Share(共享,多个线程可同时执行,如Semaphore/CountDownLatch)。本篇将讲解AQS对独占锁的实现!一:AQS设计思想1.操...原创 2019-01-29 13:09:48 · 472 阅读 · 0 评论 -
【Java并发编程】详细分析AQS原理之共享锁
上一篇我们详细分析了AQS的原理和独占式获取的方式,现在先来回顾一下AQS的基本思想: 1.操作与规则分离:AQS实现了了同步状态的管理,线程的排队,等待与唤醒等底层操作,而把线程能否获取资源,如何获取资源等业务规则则交由子类实现 2.使用CLH队列来管理等待获取同步状态的线程。 AQS定义两种资源访问方式:Exclusive(...原创 2019-02-15 21:57:58 · 1226 阅读 · 0 评论 -
【Java并发编程】阻塞队列PriorityBlockingQueue实现原理及源码解析
本篇我们将分析阻塞队列PriorityBlockingQueue实现原理,该阻塞队列每次取出的都是最小的对象,可以满足一定的实际场景。 阻塞队列PriorityBlockingQueue从不阻塞写线程,而当队列元素为空时,会阻塞读线程的读取,当然也有非阻塞的方法(poll)。该阻塞队列适用于读多于写的场景,不然,写线程过多,会导致内存消耗过大,影响性能。阻塞队...原创 2019-02-22 13:24:11 · 1141 阅读 · 2 评论 -
【Java并发编程】独占锁ReentrantLock对AQS实现的源码分析
Lock是一个接口,而synchronized是Java中的关键字,synchronized是基于jvm实现。Lock锁可以被中断,支持定时锁等。Lock的实现类,可重入锁ReentrantLock,我们有讲到其具体用法。而谈到ReentrantLock,不得不谈抽象类AbstractQueuedSynchronizer(AQS)。抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框...原创 2018-08-27 23:18:34 · 538 阅读 · 0 评论 -
【Java并发编程】java语言的线程安全级别
java是支持多线程编程的语言,java中提供了很多类,如果把这些类的实现按照线程安全级别来排序的话,则由强到弱主要可以分为以下几个级别1 绝对线程安全在任何环境下,调用者都不需要考虑额外的同步措施,都能够保证程序的正确性。这个定义要求很严格,java里面满足这个要求的类比较少,对于实现jsr133规范(java内存模型)的jdk(一般指jdk5.0之上),一般的不变类都是满足绝地线程...转载 2018-09-25 18:50:51 · 224 阅读 · 0 评论 -
【Java并发编程】ConcurrentHashMap注意问题
ConcurrentHashMap通常只被看做并发效率更高的Map,用来替换其他线程安全的Map容器,比如Hashtable和Collections.synchronizedMap。实际上,线程安全的容器,特别是Map,应用场景没有想象中的多,很多情况下一个业务会涉及容器的多个操作,即复合操作,并发执行时,线程安全的容器只能保证自身的数据不被破坏,但无法保证业务的行为是否正确。举个例子:统计文...转载 2019-01-11 16:56:31 · 1991 阅读 · 0 评论 -
【Java并发编程】AtomicReference 原子引用
概述:AtomicReference和AtomicInteger非常类似,不同之处就在于AtomicInteger是对整数的封装,底层采用的是compareAndSwapInt实现CAS,比较的是数值是否相等,而AtomicReference则对应普通的对象引用,底层使用的是compareAndSwapObject实现CAS,比较的是两个对象的地址是否相等。也就是它可以保证你在修改对象引用时的...原创 2018-08-31 21:25:53 · 23154 阅读 · 0 评论 -
【Java并发编程】用AtomicStampedReference解决ABA问题
转载地址:https://www.cnblogs.com/java20130722/p/3206742.html在运用CAS做Lock-Free操作中有一个经典的ABA问题:线程1准备用CAS将变量的值由A替换为B,在此之前,线程2将变量的值由A替换为C,又由C替换为A,然后线程1执行CAS时发现变量的值仍然为A,所以CAS成功。但实际上这时的现场已经和最初不同了,尽管CAS成功,但可能存...转载 2018-08-31 22:34:25 · 689 阅读 · 0 评论 -
【Java并发编程】线程池原理分析及ThreadPoolExecutor源码实现
线程池简介: 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。 如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。 一个线程池包括以下四个基本组...原创 2018-09-04 16:27:36 · 179 阅读 · 0 评论 -
【Java并发编程】生产者消费者模式-上篇
在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。单单抽象出生产者和消费者,还够不上是生产者/消费者模式。该模式还需要有一个缓冲区(也称之为仓库)处于生产者和消费者之间,作为一个中介。生产者把数据放入缓冲区,而消费者从缓冲区取出...原创 2019-01-18 15:50:48 · 717 阅读 · 0 评论 -
【Java并发编程】生产者消费者模式-下篇
上篇已经介绍过了使用(1)wait() / notify()方法(2)await() / signal()方法这两种方法实现生产者消费者模式,并给出了通用的生产者消费者代码模板:* 1.锁{ * 2. while 不满足条件 * 释放锁等待 条件改变 * end while * 3. 生产或者消费 * 4. 唤醒其他生产者或消费者线程 ...原创 2019-01-19 14:21:00 · 680 阅读 · 0 评论 -
【Java并发编程】管道输入输出流PipedReader/PipedWriter
线程之间通信的三种方式:(1)共享内存。(2)wait()/notify()方法。(3)管道输入输出流。本篇将介绍第三种方式,使用管道输入输出流进行线程间的通信。管道输入/输出流的思想:Java里的管道输入流PipedWriter与管道输出流PipedReader实现了类似管道的功能,用于不同线程之间的相互通信。java的管道输入与输出实际上使用的是一个循环缓冲数组...原创 2019-01-20 16:15:11 · 806 阅读 · 0 评论 -
【Java并发编程】ConcurrentHashMap原理及源码分析
ConcurrentHashMap通常只被看做并发效率更高的Map,用来替换其他线程安全的Map容器,比如Hashtable和Collections.synchronizedMap。实际上,线程安全的容器,特别是Map,应用场景没有想象中的多,很多情况下一个业务会涉及容器的多个操作,即复合操作,并发执行时,线程安全的容器只能保证自身的数据不被破坏,但无法保证业务的行为是否正确。而Concurr...原创 2019-01-12 20:30:45 · 690 阅读 · 1 评论 -
【Java并发编程】读写锁ReentrantReadWriteLock实现原理及源码分析
前两篇我们分析了AQS的独占锁和共享锁的实现原理,本篇文章将继续分析AQS的实现者ReentrantReadWriteLock的实现原理! 读写锁维护了一对相关的锁,即读锁和写锁,读锁是共享锁,允许多个线程同时访问资源,而写锁是独占锁,任一时刻只允许一个线程占有独占锁。读写锁适用于读多写少的情况。首先,思考以下几个问题!1.我们知道AQS维护着一个同步状态st...原创 2019-02-20 17:03:44 · 989 阅读 · 0 评论