并发编程
主要讲解多线程基础、Java内存模型、多线程之间的通讯、线程池原理分析、Callable与Future模式、锁的深入化、Disruptor框架等。
杨林伟
像火箭科学家一样思考!
展开
-
并发编程系列教程(完) - 终章总结
并发编程系列教程至此正式讲解完毕,本文来总结一下之前的教程知识点内容,课程系列内容如下:并发编程系列教程(01) - 多线程基础并发编程系列教程(02) - 多线程安全并发编程系列教程(03) - Volatile并发编程系列教程(04) - 重排序并发编程系列教程(05) - Java内存模型并发编程系列教程(06) - 多线程之间通讯(wait、notify、sleep、Lock...原创 2019-10-26 10:01:44 · 484 阅读 · 0 评论 -
并发编程系列教程(12) - Disruptor框架
1. 什么是DisruptorMartin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易。这个系统是建立在JVM平台上,其核心是一个业务逻辑处理器,它能够在一个线程里每秒处理6百万订单。业务逻辑处理器完全是运行在内存中,使用事件源驱动方式。业务逻辑处理器的核心是Disruptor。Disruptor 它是...原创 2019-10-25 17:49:03 · 464 阅读 · 0 评论 -
并发编程系列教程(11) - 原子类
java.util.concurrent.atomic包 :原子类的小工具包,支持在单个变量上解除锁的线程安全编程。原子变量类相当于一种泛化的 volatile 变量,能够支持原子的和有条件的读-改-写操作。AtomicInteger 表示一个int类型的值,并提供了 get 和 set 方法,这些 Volatile 类型的int变量在读取和写入上有着相同的内存语义。它还提供了一个原子的 co...原创 2019-10-25 17:10:24 · 2904 阅读 · 0 评论 -
并发编程系列教程(10) - 深入Java锁机制
1. 重入锁锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。这些已经写好提供的锁为我们开发提供了便利。重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。在JAVA环境下 ReentrantLock(显式锁、轻量级锁)和Synchronized (内置...原创 2019-10-25 16:34:03 · 467 阅读 · 0 评论 -
并发编程系列教程(09) - Callable与Future模式
代码已上传到Github,有兴趣的同学可以下载看看:https://github.com/ylw-github/Java-ThreadDemo在Java中,创建线程一般有两种方式,一种是继承Thread类,一种是实现Runnable接口。然而,这两种方式的缺点是在线程任务执行结束后,无法获取执行结果。我们一般只能采用共享变量或共享存储区以及线程通信的方式实现获得任务结果的目的。不过,Java中...原创 2019-10-25 14:25:22 · 511 阅读 · 0 评论 -
并发编程系列教程(08) - 线程池原理分析(二)
1. 什么是线程池Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。第一 :降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二 :提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三 :提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系...原创 2019-10-25 10:06:55 · 501 阅读 · 0 评论 -
并发编程系列教程(07) - 线程池原理分析(一)
1. 并发包1.1 CountDownLatch(计数器)CountDownLatch 类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了...原创 2019-10-24 17:38:02 · 480 阅读 · 0 评论 -
并发编程系列教程(06) - 多线程之间通讯(wait、notify、sleep、Lock锁、Condition)
代码已上传到Github,有兴趣的同学可以下载来看(https://github.com/ylw-github/Java-ThreadDemo)1. 什么是多线程之间通讯?多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。2. 多线程之间的通讯需求需求:第一个线程写入(input)用户,另一个线程取读取(out)用户,实现读一个,写一个操作。3. 代码实现pack...原创 2019-10-23 16:58:02 · 547 阅读 · 0 评论 -
并发编程系列教程(05) - Java内存模型
共享内存模型 指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在,它涵盖了缓存,写缓...原创 2019-10-23 15:39:25 · 476 阅读 · 0 评论 -
并发编程系列教程(04) - 重排序
1. 数据依赖性如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分下列三种类型:上面三种情况,只要重排序两个操作的执行顺序,程序的执行结果将会被改变。我们知道编译器和处理器可能会对操作做重排序。编译器和处理器在重排序时,会遵守数据依赖性,编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序。注意,这里所说的数据依赖性仅针对单个处...原创 2019-10-23 15:25:33 · 466 阅读 · 0 评论 -
并发编程系列教程(03) - Volatile
代码已上传到Github:https://github.com/ylw-github/Java-ThreadDemo1. 什么是Volatile(英: [ˈvɒlətaɪl] 美: [ˈvɑːlətl])可见性也就是说一旦某个线程修改了该被volatile修饰的变量,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,可以立即获取修改之后的值。在Java中为了加快程序的运行效...原创 2019-10-23 15:03:10 · 495 阅读 · 0 评论 -
并发编程系列教程(02) - 多线程安全
1. 什么是线程安全当多个线程同时共享时,全局变量或静态变量,做写操作时,可能会发生数据冲突的过程,也就是线程安全的问题。但是做读操作是不会发生数据冲突问题。案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。package com.ylw.thread;public class ThreadSafeDemo { public static...原创 2019-10-22 18:10:08 · 547 阅读 · 0 评论 -
并发编程系列教程(01) - 多线程基础
1. 线程与进程的区别进程是所有线程的集合,每一个线程是进程中的一条执行路径。2. 为什么使用多线程主要能体现到多线程提高程序效率。3. 多线程应用场景举例: 迅雷多线程下载、数据库连接池、分批发送短信等。4.多线程的创建方式4.1 第一种继承Thread类 重写run方法package com.ylw.thread;public class ExtendThreadDemo ...原创 2019-10-22 16:47:46 · 736 阅读 · 0 评论