Java并发编程的艺术
主要讲解Java并发编程的原理,包包含volitle、synchonrized关键字的原理、以及锁机制和线程池等。
Oeljeklaus
python开发,大数据,图数据,数据分析
展开
-
第十章 Executor框架
第十章 Executor框架线程的工作单位是Runnable和Callable,执行机制由Executor框架提供。10.1Executor框架简介10.1.1Executor框架的两级调度在上层,Java多线程程序通常把应用分解成为若干任务,然后使用用户级的调度器(Executor框架)将这些任务映射成为固定数量的线程;在底层,操作系统内核将这些线程映射到硬件处理器上。...原创 2018-06-13 08:59:31 · 906 阅读 · 0 评论 -
第九章 java中的线程池
第九章 java中的线程池线程池的好处:1.降低资源消耗2.提高响应数独3.提高线程的可管理性9.1线程池实现原理1.线程池判断核心线程池里的线程是否都在执行任务。如果不是,那就创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下个流程。2.线程池来判断工作队列是否已经满。如果工作队列没有满,则将新提交的任务存储子啊这个工作队列里。如果工...原创 2018-06-12 16:34:45 · 841 阅读 · 0 评论 -
第八章 Java中的并发工具类
第八章 Java中的并发工具类8.1等待多线程完成的CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作。类似于Thread.join()package cn.edu.hust.atomic;public class CountDownLatchTest { public static void main(String[...原创 2018-06-12 16:31:43 · 803 阅读 · 0 评论 -
第七章 Java中的13个原子操作类
第七章 Java中的13个原子操作类4中类型的原子更新方式,分别是原子更新基本类型、原子更新数组、原子更新引用和原子更新属性。主要使用Unsafe实现的包状态类。7.1原子更新基本类型AtomicBoolean:原子更新布尔类型AtomicInteger:原子更新整型AtomicLong:原子更新长整型以AtomicInteger进行讲解:int addAndGet...原创 2018-06-12 16:30:13 · 927 阅读 · 0 评论 -
第六章 Java并发容器和框架
第六章 Java并发容器和框架6.1ConcurrentHashMap的实现原理和使用ConcurrentHashMap式线程安全且高效的HashMap。6.1.1为什么要选择ConcurrentHashMap1.线程不安全的HashMap2.效率低下的HashTableHashTable使用synchronized来保证线程的安全,在线程激烈的情况下,Hashta...原创 2018-06-12 16:28:12 · 916 阅读 · 0 评论 -
第五章 Java中的锁
第五章 Java中的锁5.1Lock接口获取锁后,发生过异常,锁不会释放。锁与synchronized关键字的对比:Lock接口的实现基本都是通过聚合了一个同步器的子类来完成线程访问控制的。5.2队列同步器AbstractQueuedSynchronizer同步器是构建锁和其他同步组件的基础框架。同步器的主要使用方式是继承,子类通过继承同步器并实现它的抽...原创 2018-06-12 16:23:59 · 831 阅读 · 0 评论 -
第三章 Java内存模型
第三章 Java内存模型3.1Java内存模型的基础3.1.1并发编程模型的两个关键问题线程之间的通信机制有两种:共享内存和消息传递共享内存:线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。消息传递:线程之间没有公共状态,线程之间必须通过发送消息显示进行通信。Java的并发是共享内存模型,Java线程之间的通信总是隐式进行,整个通信过程对程序员完...原创 2018-06-12 16:13:55 · 917 阅读 · 0 评论 -
第二章 Java并发机制的底层原理
2.1volatile的应用volatile是轻量级的sychronized,它可以保证共享变量的可见性。 可见性是指一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。 不会引起线程上下文切换和调度。 2.1.1volatile的定义与实现原理Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应爱确保通过排他锁单读获取这个变量。Java语言提供...原创 2018-06-01 09:20:54 · 1969 阅读 · 1 评论 -
第一章 并发编程的挑战
并发编程的目的是为了让程序运行的更快。1.1上下文切换CPU通过时间片分配算法来循环执行任务的,当前任务执行一个时间片后就会切换到下一个任务。任务从保存到字啊加载的过程是一次上下文切换。1.1.1多线程一定快吗?多线程不一定快,因为线程有创建和上下文切换的开销。1.1.2如何减少上下文的切换减少上下文的切换方法有无所并发编程、CAS算法、使用最少线程和使用协程。无锁...原创 2018-06-01 09:19:37 · 1432 阅读 · 0 评论 -
Java内存模型与线程(一):概述
我们知道,衡量一个服务性能的高低好坏,每秒事物处理数(TPS)是重要的指标之一,它代表着一秒内服务端平均能响应的请求总数。我们知道计算机硬件中,引进了缓存技术,大大提高了程序执行速度,但是这也带来了相关问题,例如缓存一致性问题。下面是计算机处理器和高速缓存驻内存之间的交互关系。Java内存模型Java内存模型的主要目的是定义程序中哥哥变量的访问规则,记载虚拟机中将变量存储到内存和从内存中取出变量的...原创 2018-04-28 21:16:44 · 1201 阅读 · 0 评论 -
Java内存模型与线程(二):内存间交互操作
上一节,我们介绍了线程与Java内存模型之间的关系。这一节,我们将会介绍内存间交互操作,主要是Java内存与各线程之间的关系。也就是说一个变量如何从主内存拷贝到工作内存、如何让从工作内存同步回主内存之类的实现细节。首先,我们需要了解下面8种操作。lock(锁定):作用于主内存的变量;它把这一个变量标识为一个线程独占的状态。unlock(解锁):作用域主内存的变量,把一个变量释放。read(读取):...原创 2018-04-29 15:48:35 · 1437 阅读 · 0 评论 -
Java内存模型与线程(三):volatile型变量的规则
volatile变量一般是比较难以理解,这里坐着希望列举几个小例子让大家充分理解它的使用方法。对于定义了volatile的变量,这里有两条特性需要大家记住:第一、保证此变量对所有的线程都是可见性,这里的可见行是指一个线程修改了这个变量的值,新值对于其他的线程来说是可知的。这里,volatile变量不存在一致性问题,volatile变量在并发情况下并非安全。这通过一段程序说明:package cn....原创 2018-04-29 16:42:38 · 1226 阅读 · 0 评论 -
Java内存模型与线程(四):long和double的特殊规则和原子性、可见性和有序性
JVM将没有被volatile修饰的64为数据的读写操作划分为两次32位的操作,也就是long和double的非原子协定吗,多个线程共享一个long或者是double类型的变量是,可能读到一个"半个变量"的数值。不过以上这种情况非常罕见,所以这两种类型不需要volatile修饰。Java内存模型定了3个特性:原子性、可见性、有序性。原子性,也就是说上几节我们讲到的几个操作都是原子的,要么全部成功,...原创 2018-04-29 18:02:32 · 1373 阅读 · 0 评论 -
Java内存模型与线程(五):先行发生原则
1.程序次序规则:同一个线程,按照代码次序,准确来说是按照控制流顺序而不是程序代码顺序2.管道锁定规则:unlock操作先行于后面对同一个锁的lock操作3.volatile变量规则:对于修饰的变量,这里的写操作先行发生于读操作。4.线程启动规则:Thread对象的start方法先行于发生于此线程的每一个动作。5.线程终止规则:线程所有的操作都先行发生于对此线程的终止检测。6.线程中断规则:对线程...原创 2018-04-29 18:29:24 · 1303 阅读 · 0 评论 -
Java内存模型与线程(六):Java与线程
我们知道,线程是CPU调度的基本单位。线程实现的3种方式:使用内核线程实现、使用用户线程实现和使用用户线程加轻量级进程混合实现。线程调度,主要分为协同式线程调度和抢占式线程调度。Java的线程调度主要是抢占式线程调度。 Java语言定义了5中线程状态:新建:创建后尚未启动的线程处于这种状态。运行:也饿就是对应于操作系统状态中的Running和Readdy。无限期等待:这种状态不会被分配CPU执行时...原创 2018-04-29 19:08:01 · 1223 阅读 · 0 评论
分享