![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程
昨日不可追
技术人生、终身学习、投资创业|明日不可待,昨日不可追!
展开
-
java并发编程——ExecutorService\join\yield
ExecutorService\join\yield原创 2016-01-23 23:29:08 · 3053 阅读 · 0 评论 -
java并发编程—— 线程池原理 详解 ThreadPoolExecutor
为什么要使用线程池降低资源消耗: 通过重复利用线程,减少线程的创建销毁损耗的资源提高响应速度: 任务到达时,不用重新创建线程,之间可以使用已经创建好的线程执行提高线程的可管理性线程池实现原理java.util.concurrent.ThreadPoolExecutor.ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, lo原创 2016-03-26 17:42:19 · 3441 阅读 · 0 评论 -
java并发编程——ConcurrentHashMap(1.7)
ConcurrentHashMap特点:线程安全 在并发中使用HashMap存储k/v数据结构时,多个线程并发put操作会导致HashMap底层链表形成环路,导致Entry的next永远不为空,导致死循环。而ConcurrentHashMap保证了线程安全高效 相比于其他Hash结构的线程安全容器,ConcurrentHashMap有着更高的效率。HashTable的实现通过synchron原创 2016-03-26 17:44:55 · 1588 阅读 · 1 评论 -
java并发编程——阻塞队列与非阻塞队列
ArrayBlockingQueueArrayBlockingQueue是一个有界阻塞队列,基于数组、ReentrantLock、Condition实现。 所谓阻塞队列是指,队列满了,则会对生产线程产生阻塞直到有空位可插入; 当队列空了,则会对消费队列产生阻塞直到有新的元素被加入队列。 方法中含有字母t的都会产生阻塞waiting; 方法中含有o的都会返回 true/false; 剩下ad原创 2017-07-28 14:55:18 · 2398 阅读 · 0 评论 -
java并发编程——ConcurrentHashMap(1.8)
请先阅读ConcurrentHashMap1.7源码阅读,对JDK1.7(1.6中也基本一致)中的ConcurrentHashMap有个大致了解。原创 2017-07-27 17:49:21 · 1724 阅读 · 1 评论 -
java并发编程——八 理解分析并发组件-CountDownLatch\CyclicBarrier\Exchanger\Semaphore
从这章开始介绍 java.concurrent.*中的常用并发工具类,并附带有趣的示例CountDownLatch概要调用countDownLatch.countDown() count计数器-1,countDownLatch.await()阻塞当前线程,直到count值为0。适合用在多个线程协助;或用在多个点或多个任务之间协作; 那么使用CountDownLatch对象,并设置一个初始值原创 2016-03-26 21:02:16 · 1116 阅读 · 0 评论 -
java并发编程—— 六 进程协作:阻塞队列\wait() notify()\ Condition
进程协作的三种常用方式wait()&¬ifyAll()要点:wait()中释放该对象的对象锁notify() notifyAll() wait() 均是Object方法notify() notifyAll() wait() 必须在 同步方法中(实现线程安全即可)调用 否则抛 java.lang.IllegalMonitorStateException经典范式,原创 2016-03-24 23:47:34 · 3288 阅读 · 0 评论 -
java并发编程——Condition(wait\signal\notify的等待-通知模式 )
是什么Condition组件,以AQS非静态内部类的方式实现,因此Condition初始化的前提是有Lock实例。使用场景需要进程之间有协作的场景,典型的如等待-通知模型,生产-消费模型,比如有界队列:队列满了需要阻塞插入元素的线程,删除操作线程完成后唤醒被阻塞的插入操作线程。队列空了,需要阻塞删除操作线程,当有插入操作线程完成时唤醒被阻塞的删除操作线程;怎样用对比于Object的wait/noti原创 2016-12-02 16:46:51 · 4038 阅读 · 1 评论 -
java并发编程——九 AbstractQueuedSynchronizer AQS详解
AbstractQueuedSynchronizer概述AQS用来实现锁或其他同步组件的基础框架(注意区别synchronized是在字节码上加指令方式,通过底层机器语言保证同步),AQS使用int类型的volatile变量维护同步状态(state),使用Node实现FIFO队列来完成线程的排队执行。在锁的实现中通过组合AQS对象的方式使用,利用AQS实现锁的语义。AQS与锁(如Lock)的对比:原创 2016-03-27 21:38:36 · 6569 阅读 · 2 评论 -
java并发编程——一并发基础
为什么使用多线程多任务的处理,提高处理速度,减少相应时间,更好的体验随着cpu的核心数量越来越多,提供了充足的硬件基础,使用多线程重复发挥机器的计算能力,合理利用资源上下文切换cpu通过给每个线程分配cpu时间片(时间片:一般几十毫秒,是cpu分配给每个线程的时间),实现多线程执行(无论单核与多核)。cpu通过不断切换线程,已达到多个线程执行的效果。每次切换到另一个线程时,会保存当前线程的任务原创 2016-06-29 09:51:25 · 2209 阅读 · 2 评论 -
JSR 133 (Java Memory Model) FAQ
JSR 133 (Java Memory Model) FAQ http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#whatismm翻译 2017-06-24 22:43:22 · 1312 阅读 · 7 评论 -
图解java并发(上)
为什么要“并发”?既然聊并发,我们首先会思考为什么要引入这个技术。通常写程序,我们习惯用单线程串行的思维理解程序运行,并写业务逻辑。这样可以减少复杂度,也便于测试,往往当需要性能提升,我们才会想到使用并发。那么这个技术到底能够给我们带来什么呢充分利用cpu资源多核处理器的广泛使用背景下,如果我们的程序还是单线程串行的运行,会对硬件资源浪费。比如有一个5内核的cpu,单线程对cpu的...原创 2017-10-10 14:17:32 · 1320 阅读 · 1 评论 -
java并发编程——读写锁ReentrantReadWriteLock
读写锁同时允许多个读线程获取这个锁(读锁) 读写锁允许多个读线程同时获取到读锁(共享模式),但是当写线程获取到了写锁时其他任何读写操作(同一个线程依旧可以继续获取读锁,详细看下文,锁降级)均会被阻塞(排他模式)。很多场景是读大大多于写操作的,所以使用读写锁能更大程度的增强程序的吞吐量。按位切割维护两把锁 一个private volatile int state变量维护了两把锁:读锁、写锁原创 2016-11-30 21:01:42 · 1309 阅读 · 0 评论 -
java并发编程——ReentrantLock源码(重入锁、公平锁、非公平锁)
是什么?字面翻译为 可重入锁。 可重入:指当前线程获取锁之后可以再次获取这个锁,而不会被阻塞。 锁:实现了Lock接口,通过实现内部AQS子类,完成锁的实现。并且ReentrantLock是排他锁源码解析阅读ReentrantLock需要对AQS有一定理解,请查看AQS解析ReentrantLock实现了Lock接口,其中通过使用AbstractQueuedSynchronizer实现了公平锁与原创 2016-10-12 23:26:06 · 1391 阅读 · 3 评论 -
java内存模型(JMM)与并发
为什么要并发充分利用CPU计算能力随时多核处理器的发展,计算机的计算能力越来越强大。但是,由于磁盘读写、网络IO等这些通信、存储系统与CPU的速度相差多个数量级,我们在应用计算机时,如果单纯的让cpu等待磁盘IO、网络IO便是对cpu的计算能力的浪费。那么如何让CPU的能力充分利用呢,我们自然会想到让多个任务同时执行,不必因为一个任务等待在IO上而让这个cpu也同时等待(占用),这时可以让这个cpu原创 2017-06-20 20:40:34 · 996 阅读 · 0 评论 -
java并发编程——线程异常处理\资源共享的问题\ThreadLocal
过年在家的几天,因为没有网,也没有做笔记,今天一看自己写的多线程代码略感陌生。于是,从头再看一遍吧。 o(-“-)oThread到目前为之,我们应该清楚Thread只是你用来驱动任务(Runnable、Callable)的一个线程,我们对Thread并没有任何控制权,尤其是使用ExecutorService。Thread本身并没有任何逻辑,我们一般说的多线程,其实是指依附于多线程上的各种任务。要原创 2016-02-18 01:07:33 · 1353 阅读 · 0 评论 -
java并发编程—— 七 Thread理解与死锁分析(哲学家进餐演示)
线程生命周期Start 为线程分配必要的资源,初始化线程Runnable 线程创建后,进入就绪状态,此时线程具备了获取cpu时间片的资格 (线程调度器负责分配,线程调度器不受JVM控制,依赖于底册操作系统),只要调度器分配cpu时间片,即可运行。Running 奔跑吧少年Blocked 因为如下几种原因,产生阻塞,此时,调度器会忽略该线程,不再分配时间片。wait()原创 2016-03-26 17:29:17 · 1205 阅读 · 0 评论 -
java并发编程——java内存模型/happens-before
如有纰漏,请指正!java内存模型图 第一张图从JVM角度抽象,每个线程都有一个LocalMemory,用与存储读\写变量的副本,它抽象涵盖了cpu cache memory、cpu Registers。JMM是个抽象的概念,通过控制线程与主存之间的通信(同步),来保证程序执行的可见性。重排序编译器、cpu通过将指令重新排序,然后执行,以提高执行效率,编译器重排序 (javac)原创 2016-03-23 15:48:58 · 1604 阅读 · 2 评论 -
java并发编程——四(synchronized\Lock\volatile) 锁机制原理及关联
前言其实标题使用互斥机制更合适,并发中主要两个问题是:线程如何同步以及线程如何通信。同步主要是通过互斥机制保证的,而互斥机制我们最熟悉的就是锁,当然也有无锁的CAS实现。多线程共享资源,比如一个对象的内存,怎样保证多个线程不会同时访问(读取或写入)这个对象,这就是并发最大的难题,因此产生了 互斥机制(锁)。synchronized When should you synch原创 2016-02-25 23:10:28 · 3936 阅读 · 1 评论