
线程并发库
huaishu
这个作者很懒,什么都没留下…
展开
-
Java锁及实现方式
锁的概念在数据库出现比较多,为了实现数据库的不同隔离级别,数据库会定义不同的锁类型。Java为了实现同步及线程安全,也会定义不同的锁。所谓的同步操作即原子操作(atomic operation)意为“不可被中断的一个或一系列操作”,类似数据库中的事务。线程安全实现方式互斥同步(锁机制)互斥是实现同步的一种手段,临界区(Critical Section)、互斥量(Mutex)和信号量(S...原创 2019-11-26 14:03:50 · 5248 阅读 · 0 评论 -
Java内存模型的基础以及内存语义
Java中多个线程访问同一变量,对应到硬件上就是内存和CPU缓存,JVM是如何处理数据竞争的,必须了解Java的内存模型以及编译相关的JVM指令,同时还必须了解线程的实现方式。Java语言通过编译器编译成JVM认识的class文件,JVM再把Class中的指令集转换成操作系统可识别二进制编码,操作系统再驱动硬件包括CPU、内存、磁盘等硬件设备。在这个过程中,数据是多分的,如何保证数据一致性很重...原创 2019-11-22 15:51:20 · 229 阅读 · 0 评论 -
Java并发机制----同步synchronized以及原子操作
Java并发编程过程中必须接触synchronized和volatile,以及后来的读写锁ReadWriteLock、重入锁ReentrantLock等,JVM在编译synchronized时会生成2个指令集monitorenter和monitorexit,volatile则实现1)将当前处理器缓存行的数据写回到系统内存。2)这个写回内存的操作会使在其他CPU里缓存了该内存地址的数据无效。...原创 2019-11-19 15:51:24 · 425 阅读 · 0 评论 -
聊聊并发(一)——深入分析Volatile的实现原理
引言在多线程并发编程中 synchronized 和 Volatile 都扮演着重要的角色,Volatile 是轻量级的 synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。它在某些情况下比 synchronized 的开销更小,本文将深入分析在硬件层面上 Inter 处理器是如何实现 Vola...转载 2013-06-13 10:52:52 · 771 阅读 · 0 评论 -
聊聊并发(二)——Java SE1.6中的Synchronized
1 引言在多线程并发编程中 Synchronized 一直是元老级角色,很多人都会称呼它为重量级锁,但是随着 Java SE1.6 对 Synchronized 进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了 Java SE1.6 中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。2 术语定义 术语 英...转载 2013-06-13 10:55:55 · 695 阅读 · 0 评论 -
聊聊并发(三)——JAVA线程池的分析和使用
1. 引言合理利用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌。2. 线...转载 2013-06-13 10:57:57 · 699 阅读 · 0 评论 -
聊聊并发(四)——深入分析ConcurrentHashMap
术语定义术语 英文 解释 哈希算法 hash algorithm 是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值。 哈希表 hash table 根据设定的哈希函数 H(key) 和处理冲突方法将一组关键字映象到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在表中的存储位置,这种表称为哈希表或散列,所得存储位置称为哈...转载 2013-06-13 11:02:45 · 671 阅读 · 0 评论 -
聊聊并发(五)——原子操作的实现原理
1. 引言原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为"不可被中断的一个或一系列操作" 。在多处理器上实现原子操作就变得有点复杂。本文让我们一起来聊一聊在 Intel 处理器和 Java 里是如何实现原子操作的。2. 术语定义术语 英文 解释 缓存行 Cache line 缓存的最小操作单位 比...转载 2013-06-13 11:08:42 · 906 阅读 · 0 评论 -
聊聊并发(六)——ConcurrentLinkedQueue的实现原理分析
1. 引言在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式:一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环 CAS 的方式来实现,本文让我们一起来研究下 Doug Lea 是如何使用非阻塞的方式来实现线程安全队列 Conc...转载 2013-06-13 11:09:43 · 755 阅读 · 0 评论 -
Java Concurrent 探秘
我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便。而当针对高质量Java多线程并发程序设计时,为防止死蹦等现象的出现,比如使用java之前的wait()、notify()和synchronized等,每每需要考虑性能、死锁、公平性、资源管理以及如何避免线程安全性方面带来的...转载 2013-07-06 13:21:51 · 637 阅读 · 0 评论 -
线程池规模调优
线程池应该配置成多大?先前一位朋友通过Skype问我关于运行在64位机器JVM集群一些问题,该集群每天会运行几次30万+个线程的任务。30万+个线程运行时,核心模块花了太多时间管理它们,导致应用程序极其不稳定。很明显,该应用程序需要一个线程池,从而保证可以杀死客户端,而不是放任客户端把整个应用程序搞崩溃。上面的示例是比较极端的情况,但它强调了我们使用线程池的原因。尽管我们合理使用了转载 2013-11-11 10:13:38 · 1803 阅读 · 0 评论 -
JVM执行篇:使用HSDIS插件分析JVM代码执行细节
在《Java虚拟机规范》之中,详细描述了虚拟机指令集中每条指令的执行过程、执行前后对操作数栈、对局部变量表的影响等细节。这些细节描述与Sun的早期虚拟机(Sun Classic VM)高度吻合,但随着技术的发展,高性能虚拟机真正的细节实现方式已经渐渐与虚拟机规范所描述产生越来越大的差距,虚拟机规范中的描述逐渐成了虚拟机实现的“概念模型”——即实现只能保证规范描述等效。基于上面的原因,我们分析程...转载 2013-06-13 10:48:46 · 754 阅读 · 0 评论 -
内存屏障与JVM并发
内存屏障,又称内存栅栏,是一组处理器指令,用于实现对内存操作的顺序限制。本文介绍了内存屏障对多线程程序的影响。我们将研究内存屏障与JVM并发机制 的关系,如易变量(volatile)、同步(synchronized)和原子条件式(atomic conditional)。本文假定读者已经充分掌握了相关概念和Java内存模型,不讨论并发互斥、并行机制和原子性。内存屏障用来实现并发编程中称为 可见性(v...转载 2013-06-13 10:45:59 · 754 阅读 · 0 评论 -
Java多线程之线程池深入分析 (下)
一、数据结构与线程构造方法由于已经看到了ThreadPoolExecutor的源码,因此很容易就看到了ThreadPoolExecutor线程池的数据结构。图1描述了这种数据结构。图1 ThreadPoolExecutor 数据结构其实,即使没有上述图形描述ThreadPoolExecutor的数据结构,我们根据线程池的要求也很能够猜测出其数据结构出转载 2013-01-16 19:17:00 · 2003 阅读 · 0 评论 -
Java多线程之线程池深入分析
线程池是并发包里面很重要的一部分,在实际情况中也是使用很多的一个重要组件。下图描述的是线程池API的一部分。广义上的完整线程池可能还包括Thread/Runnable、Timer/TimerTask等部分。这里只介绍主要的和高级的API以及架构和原理。大多数并发应用程序是围绕执行任务(Task)进行管理的。所谓任务就是抽象、离散的工作单元(unit of work)。把转载 2013-01-16 19:10:09 · 1105 阅读 · 0 评论 -
Java容器总结
按数据结构主要有以下几类:内置容器:数组 list容器:Vetor,Stack,ArrayList,LinkedList,CopyOnWriteArrayList,AttributeList,RoleList,RoleUnresolvedList,ConcurrentLinkedQueue,ArrayBlockingQueue,LinkedBlockingQueue,Priority...原创 2013-01-17 11:37:25 · 640 阅读 · 0 评论 -
驯服 Tiger: 并发集合
在 Java 编程的早期阶段,位于 Oswego 市的纽约州立大学(SUNY) 的一位教授决定创建一个简单的库,以帮助开发人员构建可以更好地处理多线程情况的应用程序。这并不是说用现有的库就不能实现,但是就像有了标准网络库一样,用经过调试的、可信任的库更容易自己处理多线程。在 Addision-Wesley 的一本相关书籍的帮助下,这个库变得越来越流行了。最终,作者 Doug Lea 决定设法让它成转载 2013-01-17 12:15:32 · 452 阅读 · 0 评论 -
深入分析ConcurrentHashMap
线程不安全的HashMap因为多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap,如以下代码final HashMap map = new HashMap(2);Thread t = new Thread(new Runnable() { @Override public void run(转载 2013-01-17 12:50:01 · 508 阅读 · 0 评论 -
ConcurrentLinkedQueue的实现原理分析
1. 引言在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式:一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环CAS的方式来实现,本文让我们一起来研究下Doug Lea是如何使用非阻塞的方式来实现线程安全队列Concu转载 2013-01-17 12:51:12 · 1096 阅读 · 1 评论 -
深入分析Volatile的实现原理
引言在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。它在某些情况下比synchronized的开销更小,本文将深入分析在硬件层面上Inter处理器是如何实现Volatile的,通转载 2013-01-17 14:40:29 · 517 阅读 · 0 评论 -
Java 理论与实践: 正确使用 Volatile 变量
简介: Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,vol转载 2013-01-17 14:45:06 · 398 阅读 · 0 评论 -
Java多线程-工具篇-BlockingQueue
前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。认识BlockingQueue阻塞队列,顾名思义,首先它是一个队列,而转载 2013-01-17 11:02:16 · 873 阅读 · 0 评论 -
CountDownLatch 简介和例子
public class CountDownLatchTest { public static int numberOfPeople = 10;//等车的学生数 public static boolean isGone = false;//车开的标志 public static int carWaitTime = 3;//车等的时间 public转载 2013-01-16 18:26:02 · 427 阅读 · 0 评论