并发编程
netcobol
这个作者很懒,什么都没留下…
展开
-
Java高并发程序-Chapter1 并行世界 (第一讲)并行概念
1. 为什么并行a. 摩尔定律失效摩尔定律:预计18-24月芯片性能提升一倍b. 多核CPU 出现2. 并行概念同步(Synchronous)和异步 (Asynchronous)同步同步调用,这种调用方式是一种阻塞式的调用方式,即客户端(主调用方)代码一直阻塞等待直到被服务端(被调用方)返回 为止 异步一个可以无需等待被调用函数的返回值就让操作继续进行的方法并发(Concurrency) 和 并行...原创 2018-03-27 08:18:49 · 524 阅读 · 0 评论 -
Java高并发程序-Chapter3 JDK并发包(第十五讲)同步控制之CyclicBarrier 循环栅栏
1. 概述Cyclic意为循环,也就是说这个计数器可以反复使用。比如,假设我们将计数器设置为10。那么凑齐第一批10个线程后,计数器就会归零,然后接着凑齐下一批10个线程2. 主要接口public CyclicBarrier(int parties, Runnable barrierAction)barrierAction就是当计数器一次计数完成后,系统会执行的动作await3. 示意图4. 程序...原创 2018-03-28 08:16:10 · 204 阅读 · 0 评论 -
Java高并发程序-Chapter3 JDK并发包(第十六讲)同步控制之LockSupport
1. 概述LockSupport是一个非常方便实用的线程阻塞工具,它可以在线程内任意位置让线程阻塞。和Thread.suspend相比,它弥补了由于 resume在前发生,导致线程无法继续执行的情况。和Object.wait()相比,它不需要先获得某个对象的锁,也不会抛出 InterruptedException异常。Lock Support的静态方法 park()可以阻塞当前线程,类似的还有 p...原创 2018-03-28 08:16:31 · 243 阅读 · 0 评论 -
Java高并发程序-Chapter3 JDK并发包(第十七讲)同步控制之ReentrantLock 的实现
ReentrantLock 的实现1. CAS2. 等待队列3. park()说明: ReentrantLock 默认使用NonfairSync 的 lock 方法说明: NonfairSync 的 lock 方法 使用CAS ,如果某一个Thread (命名 ThreadA) 成功将stateOffset 从0变成1 (利用CPU指令集在一个事务中完成),这个线程 ThreadA 获取到当前lo...原创 2018-03-28 08:17:13 · 259 阅读 · 0 评论 -
Java高并发程序-Chapter3 JDK并发包(第十八讲)同步控制之自定义SafeQueue
通过AtomicReference 实现 CAS 操作,完成无锁的SafeQueuepackage com.john.learn.high.concurent.ch03.tools.support;public class Node<T> { public Node prev; public Node next; public T item; }package com....原创 2018-03-28 08:17:50 · 268 阅读 · 0 评论 -
Java高并发程序-Chapter3 JDK并发包(第十九讲)线程复用:线程池
1. 为什么使用线程池?由于真实环境的需要,可能会开启很多线程来支撑其应用。而当线程数量过大时,反而会耗尽CPU和内存资源。虽然与进程相比,线程是一种轻量级的工具,但其创建和关闭依然需要花费时间,如果为每一个小的任务都创建一个线程,很有可能出现创建和销毁线程所占用的时间大于该线程真实工作所消耗的时间的情况,反而会得不偿失2. 什么是线程池线程池中,总有那么几个活跃线程。当你需要使用线程时,可以从池...原创 2018-03-28 08:41:51 · 229 阅读 · 0 评论 -
Java高并发程序-Chapter3 JDK并发包(第二十讲)Fork/Join
1. 思想2. 使用接口RecursiveTask:用于任务有返回结果的场景。RecursiveAction:用于任务没有返回结果的场景。3. 简单用例CountForkJoinTask :数字求和。设计思路:package com.john.learn.high.concurent.ch03.threadpool;import java.util.ArrayList;import java...原创 2018-03-29 08:15:09 · 341 阅读 · 1 评论 -
Java高并发程序-Chapter3 JDK并发包(第二十一讲)JDK 并发容器
1. 集合包装HashMapCollectoins.synchronizedMap(new HashMap())而其他所有相关的Map操作都会使用这个 mutex进行同步。从而实现线程安全。这个包装的Map可以满足线程安全的要求。但是,它在多线程环境中的性能表现并不算太好。无论是对Map的读取或者写入,都需要获得 mutex的锁,这会导致所有对Map的操作全部进入等待状态,直到 mutex锁可用。...原创 2018-03-29 08:59:43 · 275 阅读 · 0 评论 -
Java高并发程序-Chapter4 并行模式与算法(第二十二讲)设计模式
在软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。这个术语是由埃里希·伽玛(Erich Gamma)等人在1990年代从建筑设计领域引入到计算机科学的。 Richard Helm, Ralph Johnson ,John Vlissides (Gof) 《设计模式:可复用面向对象软件的基础》收录23种模式 –观察者模式 –策略模式...原创 2018-03-29 09:04:57 · 189 阅读 · 0 评论 -
Java高并发程序-Chapter4 并行模式与算法(第二十三讲)单利模式
1.饿汉模式package com.john.learn.high.concurent.ch04.singleton;public class StarvationSingleton { public StarvationSingleton() { System.out.println("Starvation Singleton is created..."); } publi...原创 2018-03-29 09:11:47 · 183 阅读 · 0 评论 -
Java高并发程序-Chapter4 并行模式与算法(第二十四讲)不变模式
不变模式一个类的内部状态创建后,在整个生命期间都不会发生变化时,就是不变类 不变模式不需要同步注意:不变模式通过回避问题而不是解决问题的态度来处理多线程并发访问控制。不变对象是不需要进行同步操作的。由于并发同步会对性能产生不良的影响,因此,在需求允许的情况下,不变模式可以提高系统的并发性能和并发量JDK 不变模式: java.lang.String java.lang.Boolean j...原创 2018-03-29 09:13:11 · 222 阅读 · 0 评论 -
Java高并发程序-Chapter4 并行模式与算法(第二十五讲)生产者-消费者模式
1.模式定义生产者-消费者模式是一个经典的多线程设计模式。它为多线程间的协作提供了良好的解决方案。在生产者-消费者模式中,通常由两类线程,即若干个生产者线程和若干个消费者线程。生产者线程负责提交用户请求,消费者线程则负责具体处理生产者提交的任务。生产者和消费者之间则通过共享内存缓冲区进行通信。图5.1 展示了生产者-消费者模式的基本结构。三个生产者线程将任务提交到共享内存缓冲区,消费者线程并不直接...原创 2018-03-29 09:18:22 · 209 阅读 · 0 评论 -
Java高并发程序-Chapter4 并行模式与算法(第二十六讲)Future 模式
1. 模式定义Future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用。当我们需要调用一个函数方法时,如果这个函数执行很慢,那么我们就要进行等待。但有时候,我们可能并不急着要结果。因此,我们可以让被调者立即返回,让它在后台慢慢处理这个请求。对于调用者来说,则可以先处理一些其他任务,在真正需要数据的场合再去尝试获得需要的数据Future模式有点类似在网上买东西。如果我们在网上下单...原创 2018-03-29 09:32:58 · 397 阅读 · 0 评论 -
Java高并发程序-Chapter4 并行模式与算法(第二十七讲)并行流行线
1. 模式概念现在要生产一批小玩偶。小玩偶的制作分为四个步骤,第一要组装身体,第二要在身体上安装四肢和头部,第三,给组装完成的玩偶穿上一件漂亮的衣服,第四,就可以包装出货了。为了加快制作玩具的进度,我们不可能叫四个人同时加工一个玩具,因为这四个步骤有着严重的依赖关系。如果没有身体,就没有地方安装四肢,如果没有组装完成,就不能穿衣服,如果没有穿上衣服,就不能包装发货。因此,找四个人来做一个玩偶是毫无...原创 2018-03-29 09:37:50 · 425 阅读 · 1 评论 -
Java高并发程序-Chapter4 并行模式与算法(第二十八讲)并行搜索
1. 模式概念搜索是几乎每一个软件都必不可少的功能。对于有序数据,通常可以采用二分查找法。对于无序数据,则只能挨个查找。在本节中,我们将讨论有关并行的无序数组的搜索实现。给定一个数组,我们要查找满足条件的元素。对于串行程序来说,只要遍历一下数组就可以得到结果。但如果要使用并行方式,则需要额外增加一些线程间的通信机制,使各个线程可以有效地运行。2.程序代码01//切分数据多线程package c...原创 2018-03-29 09:40:16 · 299 阅读 · 0 评论 -
Java高并发程序-Chapter5 锁的优化及注意事项(第二十九讲)锁优化思路和建议
1. 减少锁的持有时间减少锁的持有时间有助于降低锁冲突的可能性,进而提升系统的并发能力Good Example:2. 减少锁粒度所谓减少锁粒度,就是指缩小锁定对象的范围,从而减少锁冲突的可能性,进而提高系统的并发能力。 将大对象,拆成小对象,大大增加并行度,降低锁竞争 偏向锁,轻量级锁成功率提高 HashMap的同步实现 –Collections.synchronizedMap(Map<...原创 2018-03-29 09:52:37 · 159 阅读 · 0 评论 -
Java高并发程序-Chapter3 JDK并发包(第十三讲)同步控制之 CoutDownLatch
1.概念倒数计时器一种典型的场景就是火箭发射。在火箭发射前,为了保证万无一失,往往还要进行各项设备、仪器的检查。只有等所有检查完毕后,引擎才能点火。这种场景就非常适合使用CountDownLatch。它可以使得点火线程,等待所有检查线程全部完工后,再执行。2. 主要接口static final CountDownLatch end = new CountDownLatch(10);end.coun...原创 2018-03-28 08:15:19 · 310 阅读 · 0 评论 -
Java高并发程序-Chapter3 JDK并发包(第十四讲)同步控制之自己动手实现 CoutDownLatch
这里我们自己动手实现 CoutDownLatch,使用LockSupport 和 等待队列, 如何无法理解,可以学习 《ReentrantLock 的实现》package com.john.learn.high.concurent.ch03.tools;import java.util.Iterator;import java.util.concurrent.ConcurrentLinked...原创 2018-03-28 08:15:46 · 294 阅读 · 0 评论 -
Java高并发程序-Chapter1 并行世界 (第二讲)并发级别及两个定律
并发级别堵塞 (Blocking)一个线程占用临时区资源,那么其他所有需要这个线程就必须进行等待,等待会导致线程挂起。如果说阻塞的控制方式是悲观策略。也就是说,系统认为两个线程之间很有可能发生不幸的冲突,因此,以保护共享数据为第一优先级非堵塞-无饥饿 (Starvation-Free)如果线程之间是有优先级的,那么线程调度的时候总是会倾向于满足高优先级的线程也就说是,对于同一个资源的分配,是不公...原创 2018-03-27 08:19:17 · 352 阅读 · 0 评论 -
Java高并发程序-Chapter1 并行世界 (第三讲)Java 内存模型 JMM
1. 原子性 (Atomicity)原子性是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其它线程干扰i++是原子操作吗? 不是 (读取 运算 和 赋值 三个操作) long 赋值 (8个字节 64位)如果我们使用long型的话,对于32位系统来long型数据的读写不是原子性的(因为long有64位)也就是说,如果两个线程同时对long进行写入的话(或者读取)...原创 2018-03-27 08:19:27 · 312 阅读 · 0 评论 -
Java高并发程序-Chapter2 Java并行程序基础 (第四讲)进程和线程
1. 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。用稍微专业点的术语说,线程就是轻量级进程,是程序执行的最小单位。使用多线程而不是用多进程去进行并发程...原创 2018-03-27 08:38:52 · 288 阅读 · 0 评论 -
Java高并发程序-Chapter2 Java并行程序基础 (第五讲)线程的基本操作
1. 新建线程 Thread 有一个run()方法,但没有任何需要执行。 注意:不要用run()来开启新线程。它只会在当前线程中,串行执行run()中的代码Thread t1=new Thread(); t1.run(); 调用 start方法和直接调用run方法的区别:start:开启一个新的Thread run:仅仅在当前线程执行考虑到Java是单继承的,也就是说继承本身也是一种很宝贵的...原创 2018-03-27 09:57:19 · 248 阅读 · 0 评论 -
Java高并发程序-Chapter5 锁的优化及注意事项(第三十一讲)ThreadLocal
1. 名词概念为每一个线程分配不同的对象,需要在应用层面保证。 ThreadLocal只是起到了简单的容器作用。2.简单使用SimpleDateFormat 线程不安全 ThreadLocal 保护 SimpleDateFormat (每一个线程分配一个实例) 3. 实现原理...原创 2018-04-02 10:17:10 · 234 阅读 · 0 评论 -
Java高并发程序-Chapter5 锁的优化及注意事项(第三十二讲)无锁
1. 无锁类原理详解CAS:CAS算法的过程是这样:它包含3个参数CAS(V,E,N)。V表示要更新的变量,E表示预期值,N表示新值。仅当V值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么都不做。最后,CAS返回当前V的真实值。CAS操作是抱着乐观的态度进行的,它总是认为自己可以成功完成操作。当多个线程同时使用CAS操作一个变量时,只有一个会胜出,...原创 2018-04-02 10:19:05 · 189 阅读 · 0 评论 -
Java高并发程序-Chapter5 锁的优化及注意事项(第三十三讲)无锁 - 无锁类的使用
1. AtomicIntegerAPIpublic final int get() //取得当前值public final void set(int newValue) //设置当前值public final int getAndSet(int newValue) //设置新值,并返回旧值public final boolean compareAndSet(int expect, int upda...原创 2018-04-02 10:31:38 · 224 阅读 · 0 评论 -
Java高并发程序-Chapter5 锁的优化及注意事项(第三十四讲)无锁 - LockFreeVector
LockFreeVector: 无锁Vector1. Descriptorstatic class Descriptor<E> { public int size; volatile WriteDescriptor<E> writeop; public Descriptor(int size, WriteDescriptor<E&g...原创 2018-04-02 10:41:31 · 1188 阅读 · 1 评论 -
Java高并发程序-Chapter2 Java并行程序基础 (第六讲)volatile 与 Java 内存模型 JMM
Java内存模型都是围绕着原子性、有序性和可见性展开的1. 原子性指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其它线程干扰。2. 可见性指当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道这个修改。显然,对于串行程序来说,可见性问题是不存在的。因为你在任何一个操作步骤中修改了某个变量,那么在后续的步骤中,读取这个变量的值,一定是修改后的新值3. 有序...原创 2018-03-27 11:18:08 · 210 阅读 · 0 评论 -
Java高并发程序-Chapter2 Java并行程序基础 (第七讲)线程组 、守护线程、线程优先级
1.线程组 线程分门别类的管理package com.john.learn.high.concurent.chapter02.group;public class ThreadGroupName implements Runnable{ public void run() { String groupAndName = Thread.currentThread()...原创 2018-03-27 11:32:47 · 182 阅读 · 0 评论 -
Java高并发程序-Chapter2 Java并行程序基础 (第八讲)线程组 、守护线程、线程优先级
线程安全的概念与 synchronized1. 指定加锁对象指定加锁对象:对给定对象加锁,进入同步代码前要获得给定对象的锁public class AccountSyncByInstance implements Runnable { public void run() { for (int j = 0; j < 100000; j++) { synchroniz...原创 2018-03-27 11:38:34 · 206 阅读 · 0 评论 -
Java高并发程序-Chapter3 JDK并发包(第九讲)同步控制之 ReentrantLock 重用锁
ReentrantLock 重用锁1. 可重用import java.util.concurrent.locks.ReentrantLock;public class ReenterLock implements Runnable { public static ReentrantLock reentrantLock = new ReentrantLock(); public st...原创 2018-03-27 13:23:29 · 585 阅读 · 1 评论 -
Java高并发程序-Chapter3 JDK并发包(第十讲)同步控制之 Condition
1. 概述类似于 Object.wait() 和 Object.notify() 与ReentrantLock结合使用2. 主要接口 (注意不是wait方法,有一个a开头 await)void await() throws InterruptedException;void awaitUninterruptibly();long awaitNanos(long nanosTimeout) thro...原创 2018-03-28 08:14:11 · 200 阅读 · 0 评论 -
Java高并发程序-Chapter3 JDK并发包(第十一讲)同步控制之 Semaphore
1. 概述Semaphore 共享锁,运行多个线程同时临界区2. 主要接口public void acquire()public void acquireUninterruptibly()public boolean tryAcquire()public boolean tryAcquire(long timeout, TimeUnit unit)public void release()3. 程...原创 2018-03-28 08:14:25 · 208 阅读 · 0 评论 -
Java高并发程序-Chapter3 JDK并发包(第十二讲)同步控制之 ReadWriteLock
1. 访问情况读-读不互斥:读读之间不阻塞。读-写互斥:读阻塞写,写也会阻塞读。写-写互斥:写写阻塞。2.主要接口private static ReentrantReadWriteLock readWriteLock=new ReentrantReadWriteLock();private static Lock readLock = readWriteLock.readLock();privat...原创 2018-03-28 08:14:44 · 220 阅读 · 0 评论 -
Java高并发程序-Chapter5 锁的优化及注意事项(第三十讲)虚拟机内的锁优化
1.偏向锁锁偏向是一种针对加锁操作的优化手段。它的核心思想是:如果一个线程获得了锁,那么锁就进入偏向模式。当这个线程再次请求锁时,无须再做任何同步操作。这样就节省了大量有关锁申请的操作,从而提高了程序性能。因此,对于几乎没有锁竞争的场合,偏向锁有比较好的优化效果,因为连续多次极有可能是同一个线程请求相同的锁。而对于锁竞争比较激烈的场合,其效果不佳。因为在竞争激烈的场合,最有可能的情况是每次都是不同...原创 2018-04-02 10:12:58 · 145 阅读 · 0 评论