并发编程
白夜行悟空
这个作者很懒,什么都没留下…
展开
-
四、并发编程之内置锁(synchronized)
内置锁多线程的锁,其实本质上就是给一块内存空间的访问添加访问权限,因为Java中是没有办法直接对某一块内存进行操作的,又因为Java是面向对象的语言,一切皆对象,所以具体的表现就是某一个对象承担锁的功能,每一个对象都可以是一个锁。内置锁,使用方式就是使用 synchronized 关键字,synchronized 方法或者 synchronized 代码块。1、修饰普通方法public cl...原创 2018-12-04 14:56:36 · 155 阅读 · 0 评论 -
二十七、并发编程之并发工具类CountDownLatch详解
谁谁转载 2018-12-28 18:45:29 · 611 阅读 · 0 评论 -
十八、并发编程之线程之间的通信之wait、notify
一、线程的几种状态线程有四种状态:1.产生(New):线程对象已经产生,但尚未被启动,所以无法执行。如通过new产生了一个线程对象后没对它调用start()函数之前。2.可执行(Runnable):每个支持多线程的系统都有一个排程器,排程器会从线程池中选择一个线程并启动它。当一个线程处于可执行状态时,表示它可能正处于线程池中等待排排程器启动它;也可能它已正在执行。如执行了一个线程对象的...转载 2018-12-18 13:51:03 · 129 阅读 · 0 评论 -
十九、并发编程之通过生产者消费者模型理解等待唤醒机制
生产者//生产者public class PushTarget implements Runnable{ private Tmail tmail;//销售平台 public PushTarget(Tmail tmail) { this.tmail = tmail; } @Override public void run() { while(true) {//无限循环 ...原创 2018-12-18 16:55:44 · 185 阅读 · 0 评论 -
二十八、并发编程之并发工具类CyclicBarrier详解
一、概述CyclicBarrier是一个同步工具类,它允许一组线程互相等待,直到到达某个公共屏障点。与CountDownLatch不同的是该barrier在释放等待线程后可以重用,所以称它为循环(Cyclic)的屏障(Barrier)。CyclicBarrier支持一个可选的Runnable命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续...转载 2019-01-03 18:47:24 · 226 阅读 · 0 评论 -
二十九、并发编程之并发工具类Semaphore详解
一、简介Semaphore是一个计数信号量,常用于限制可以访问某些资源(物理或逻辑的)线程数目。Semaphore有两种模式,公平模式和非公平模式。公平模式就是调用acquire的顺序就是获取许可证的顺序,遵循FIFO;而非公平模式是抢占式的,也就是有可能一个新的获取线程恰好在一个许可证释放时得到了这个许可证,而前面还有等待的线程。二、三、原理1、构造方法Semaphore有两个构造方...转载 2019-01-03 18:47:45 · 328 阅读 · 0 评论 -
二十、并发编程之Condition的使用
三个线程按顺序循环执行使用线程之间的通信wait、notify写代码public class Demo { private int signal; public synchronized void a() { while(signal != 0 ) {//signal等于0打印a try { wait();//等待 } catch (InterruptedExc...原创 2018-12-19 12:01:59 · 193 阅读 · 0 评论 -
二十一、使用Condition重写waitnotify生产者消费者模型案例
//生产者public class PushTarget implements Runnable{ private Tmail tmail;//销售平台 public PushTarget(Tmail tmail) { this.tmail = tmail; } @Override public void run() { while(true) {//无限循环 tmail...原创 2018-12-19 12:03:41 · 295 阅读 · 0 评论 -
三十九、并发编程之ConcurrentHashMap源码解析
一、ConcurrentHashMap实现原理众所周知,哈希表是中非常高效,复杂度为O(1)的数据结构,在Java开发中,我们最常见到最频繁使用的就是HashMap和HashTable,但是在线程竞争激烈的并发场景中使用都不够合理。1.HashMapHashMap是线程不安全的,在并发环境下,可能会形成环状链表(扩容时可能造成),导致get操作时,cpu空转,所以,在并发环境中使用HashM...转载 2019-01-10 15:33:39 · 275 阅读 · 0 评论 -
四十、并发编程之线程池
一、线程池概述1、什么是线程池Java中开辟出了一种管理线程的概念,这个概念叫做线程池,线程池的好处,就是可以方便的管理线程,也可以减少内存的消耗。2、线程池的优势降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系...原创 2019-01-11 19:02:42 · 196 阅读 · 0 评论 -
四十一、并发编程之Java的Executor框架实现原理
一、Java的Executor框架二、Executor接口 public interface Executor { void execute(Runnable command); } Executor接口是Executor框架中最基础的部分,定义了一个用于执行Runnable的execute方法,它没有实现类只有另一个重要的子接口ExecutorSe...转载 2019-01-11 19:03:03 · 241 阅读 · 0 评论 -
三十一、并发编程之FutureTask详解
聊聊多线程你真的了解并发吗多线程和并发多线程和多进程线程一定快吗学习并发的四个阶段学习目标适合人群荐书熟练掌握API,能够完成并发编程熟读API源码,掌握其原理理解Java虚拟机的内存模型操作系统对并发的支持学习并发的四个阶段为什么要学习并发编程1.发挥多处理的强大能力2.建模的简单性3.异步事件的简化处理4.响应更加灵敏的用户界面1.找工作,面试2.了解并...转载 2019-01-08 11:20:16 · 1206 阅读 · 0 评论 -
三十二、并发编程之Fork/Join框架
一、 什么是Fork/Join框架Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。我们再通过Fork和Join这两个单词来理解下Fork/Join框架,Fork就是把一个大任务切分为若干子任务并行的执行,Join就是合并这些子任务的执行结果,最后得到这个大任务的结果。比如计算1+2+。。+1...转载 2019-01-08 14:37:31 · 151 阅读 · 0 评论 -
三十三、并发编程之同步容器与并发容器
一、同步容器1、容器框架在Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map。List、Set、Queue接口分别继承了Collection接口,Map本身是一个接口。注意Collection和Map是一个顶层接口,而List、Set、Queue则继承了Collection接口,分别代表数组、集合和队列这三大类容器。像ArrayList、LinkedList都是实...转载 2019-01-08 18:38:24 · 225 阅读 · 0 评论 -
三十四、并发编程之并发容器CopyOnWriteArrayList原理与使用
一、简介CopyOnWriteArrayList是Java并发包中提供的一个并发容器,它是个线程安全且读操作无锁的ArrayList,写操作则通过创建底层数组的新副本来实现,是一种读写分离的并发策略,我们也可以称这种容器为"写时复制器",Java并发包中类似的容器还有CopyOnWriteSet。本文会对CopyOnWriteArrayList的实现原理及源码进行分析。二、实现原理我们都知道...转载 2019-01-08 19:09:06 · 225 阅读 · 0 评论 -
三十七、并发编程之有界阻塞队列 ArrayBlockingQueue 原理探究
一、 ArrayBlockingQueue简介基于数组的阻塞队列实现,在ArrayBlockingQueue内部,维护了一个定长数组,以便缓存队列中的数据对象,这是一个常用的阻塞队列,除了一个定长数组外,ArrayBlockingQueue内部还保存着两个整形变量,分别标识着队列的头部和尾部在数组中的位置。ArrayBlockingQueue在生产者放入数据和消费者获取数据,都是共用同一个锁对...转载 2019-01-09 19:06:16 · 254 阅读 · 0 评论 -
三十六、并发编程之阻塞队列BlockingQueue原理与使用
一、前言在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。二、认识BlockingQueue阻塞队列,顾名思义,首先它是一个队列,而一个队列在数据结构中所...转载 2019-01-09 19:06:37 · 266 阅读 · 0 评论 -
三十八、并发编程之阻塞队列LinkedBlockingQueue原理简析
一、LinkedBlockingQueue简介基于链表的阻塞队列,同ArrayListBlockingQueue类似,其内部也维持着一个数据缓冲队列(该队列由一个链表构成),当生产者往队列中放入一个数据时,队列会从生产者手中获取数据,并缓存在队列内部,而生产者立即返回;只有当队列缓冲区达到最大值缓存容量时(LinkedBlockingQueue可以通过构造函数指定该值),才会阻塞生产者队列,直到...转载 2019-01-09 19:07:01 · 448 阅读 · 1 评论 -
十七、并发编程之读写锁ReentrantReadWriteLock的锁降级
锁降级锁降级是指写锁降级为读锁。在写锁没有释放的时候,获取到读锁,再释放写锁锁升级(ReentrantReadWriteLock是不支持的。)把读锁升级为写锁在读锁没有释放的时候,获取到写锁,再释放读锁oracle官网的对于锁降级的示例代码: class CachedData { Object data; volatile boolean cacheVal...转载 2018-12-17 18:54:48 · 357 阅读 · 0 评论 -
十六、并发编程之读写锁认识与原理
一、读写锁认识排他锁(写):在同一时刻只有一个线程可以进入共享锁(读):在同一时刻可以有多个线程同时进入package com.roocon.thread.ta4;import java.util.HashMap;import java.util.Map;import java.util.concurrent.locks.Lock;import java.util.concurr...转载 2018-12-17 18:03:35 · 392 阅读 · 0 评论 -
二十五、并发编程之join应用与实现原理剖析
1、join有什么用呢?当一个线程正在进行中的时候,如果我们想调用另外一个线程的话,这时我们可以使用join。2、join方法的底层原理,简单来说就是,join方法能把所调用join方法的线程进入休眠状态(wait()),等执行完joinThread线程之后,会自动调用notifyAll方法叫醒所有处于wait状态的线程。看过AQS的朋友,应该很容易理解join方法。但是有一点是,能用j...转载 2018-12-20 15:32:17 · 156 阅读 · 0 评论 -
五、并发编程之synchronized保证线程安全的原理
在终端执行以下命令查看class文件的字节码Amy:~ Amy$ cd /Users/Amy/Documents/workplace/project/bin/com/roocon/thread/t3 Amy:t3 Amy$ javap -verbose Sequence.class这里用一个片段讲解:public int getSubOrAdd(); descriptor: ()...原创 2018-12-04 14:58:00 · 220 阅读 · 0 评论 -
六、并发编程之偏向锁、轻量级锁、重量级锁
java中每个对象都可作为锁,锁有四种级别,按照量级从轻到重分为:无锁、偏向锁、轻量级锁、重量级锁。每个对象一开始都是无锁的,随着线程间争夺锁,越激烈,锁的级别越高,并且锁只能升级不能降级。1、java对象头锁的实现机制与java对象头息息相关,锁的所有信息,都记录在java的对象头中。用2字(32位JVM中1字=32bit=4baye)存储对象头,如果是数组类型使用3字存储(还需存储数组长度...转载 2018-12-04 14:59:29 · 325 阅读 · 0 评论 -
七、并发编程之单例问题与线程安全性深入解析
1、饿汉式出现线性安全性问题要满足三个条件:多线程的环境下(满足)、必须有共享资源(满足)、对资源进行非原子性操作(不满足),没有线程安全性问题。public class Singleton { //私有化构造方法 private Singleton() {} //饿汉式 private static Singleton instance = new Singleton(); p...原创 2018-12-04 15:45:08 · 148 阅读 · 0 评论 -
八、并发编程之重入锁、自旋锁、死锁
1、重入锁重入锁:能够让线程进行重入的锁叫作重入锁,也叫递归锁,在JAVA环境下 ReentrantLock 和synchronized 都是可重入锁。锁重入:某个线程获得一个已经由它自己持有的锁对象,那么这个请求就会成功,即重入。重入是对本线程来说,即本线程多资源可以多次加锁进入,而不会出现阻塞。锁重入现象:1.当进入a方法的时候,线程必须先拿到当前类的实例(锁),这个时候,a的方法内...原创 2018-12-04 16:28:07 · 205 阅读 · 0 评论 -
九、并发编程之volatile原理与使用
1、锁两种主要特性:互斥(mutual exclusion) 和可见性(visibility)。互斥:一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性:它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或...转载 2018-12-05 15:05:30 · 167 阅读 · 0 评论 -
十、并发编程之JDK提供的原子类原理及使用
1、简介Atomic一词跟原子有点关系,后者曾被人认为是最小物质的单位。计算机中的Atomic是指不能分割成若干部分的意思。如果一段代码被认为是Atomic,则表示这段代码在执行过程中,是不能被中断的。通常来说,原子指令由硬件提供,供软件来实现原子方法(某个线程进入该方法后,就不会被中断,直到其执行完成)在x86 平台上,CPU提供了在指令执行期间对总线加锁的手段。CPU芯片上有一条引线#HL...原创 2018-12-05 17:04:13 · 132 阅读 · 0 评论 -
十一、并发编程之Lock接口的认识与使用
1、认识2、优势Lock 类似于synchronized,具有相同的互斥性和内存可见性,但是更加灵活,加锁和放锁可以由使用者自己确定,Synchronized不需要显示地获取和释放锁,简单可以方便的实行公平性非阻塞的获取锁能被中断的获取锁,synchronized锁可能出现异常而导致中断,无法释放锁,但是通过使用lock,可以直接将lock放在异常finally中,强制释放锁。超...原创 2018-12-05 17:40:09 · 239 阅读 · 0 评论 -
一、并发编程之并发、线程及进程的简介
1、并行与并发并行指在同一时间点同时执行并发是指在同一时间片段同时执行进程之间相互独立,可实现并行,多线程只能并发执行,实际还是顺执行,只是在同一时间片段,假似同时执行,cpu可以按时间切片执行,单核cpu同一个时刻只支持一个线程执行任务,多线程并发事实上就是多个线程排队申请调用cpu,cpu处理任务速度非常快,所以看上去多个线程任务是同时处理。2、并发的缺点安全性问题活跃性问题...原创 2018-12-03 17:24:16 · 212 阅读 · 0 评论 -
二、并发编程之线程的生命周期详解
1、线程状态Start:初始化状态,调用start()方法,线程状态就变成就绪状态。ready-to-run:准备运行(就绪)状态,一旦抢占到了CPU就变成了运行状态,遇到stop(),或者run() exits就变成死亡状态。Running:运行状态,线程运行结束后就变成了死亡状态,遇到Object.wait()就变成等待状态,遇到Thread.sleep()就变成睡眠状态,遇到IO...原创 2018-12-03 17:27:17 · 200 阅读 · 0 评论 -
三、并发编程之创建线程的多种方式
1、继承Thread类/** * 1、创建线程 继承Thread类 * */public class Demo1 extends Thread{ public Demo1(String name){ super(name); } /** * 1、守护线程 * */// @Override// public void run() {// while(true) ...原创 2018-12-03 17:36:32 · 141 阅读 · 0 评论 -
十二、并发编程之AbstractQueuedSynchronizer(AQS)详解
AbstractQueuedSynchronizer(AQS)详解转载 2018-12-13 10:16:32 · 515 阅读 · 0 评论 -
十三、并发编程之使用AQS重写自己的锁
package com.roocon.thread.ta2;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.AbstractQueuedSynchronizer;import java.util.concurrent.locks.Condition;import java.util.concur...原创 2018-12-13 15:39:52 · 323 阅读 · 0 评论 -
二十二、并发编程之使用Condition实现一个先入先出的有界队列
//先入先出队列public class MyQueue<E> { private Object[] obj;//数组(队列) private int addIndex;//添加角标 private int removeIndex;//移除脚标 private int queueSize;//队列长度 private Lock lock = new ReentrantLoc...原创 2018-12-19 14:02:46 · 333 阅读 · 0 评论 -
十四、并发编程之ReentrantLock公平锁和非公平锁原理详解
一、简介Java语言中有许多原生线程安全的数据结构,比如ArrayBlockingQueue、CopyOnWriteArrayList、LinkedBlockingQueue,它们线程安全的实现方式并非通过synchronized关键字,而是通过java.util.concurrent.locks.ReentrantLock来实现。ReentrantLock的实现是基于其内部类FairSync...转载 2018-12-13 17:57:05 · 6028 阅读 · 1 评论 -
十五、并发编程之写自己的公平锁
package com.roocon.thread.ta3;import java.util.ArrayList;import java.util.List;public class FairLock { private boolean isLocked = false; private Thread lockingThread = null; private List<Qu...原创 2018-12-13 18:00:27 · 124 阅读 · 0 评论 -
二十三、并发编程之深入解析Condition源码
一、Condition简介1、Object的wait和notify/notifyAll方法与Condition区别任何一个java对象都继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,比如wait(),wait(long timeout),wait(long timeout, int nanos)与notify(),notifyAll()几个方法实现等待/通知机制。...转载 2018-12-19 19:34:59 · 472 阅读 · 0 评论 -
二十四、并发编程之简易数据连接池
public class MyDataSource { private LinkedList<Connection> pool = new LinkedList(); //链表放连接池用 private static final int INIT_CONNECTIONS = 10;//初始化连接数 private static final String DRIVER_CLASS...原创 2018-12-20 15:00:59 · 147 阅读 · 0 评论 -
三十五、并发编程之并发容器ConcurrentLinkedQueue原理与使用
一、简介一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。当多个线程共享访问一个公共 collection 时,ConcurrentLinkedQueue 是一个恰当的选择。此队列不允许使用 null 元素。二、方法摘要o...转载 2019-01-09 16:57:11 · 580 阅读 · 0 评论