0.Java并发包系列开篇
在我们想要谈论Java并发包(java.util.concurrent)的时候,这是一个头疼的问题,却又是每个Java工程师不得不掌握的一项技能。一直以来都想写一个Java并发包系列,无奈迟迟没有动手动脑。最近重新思考规划了自己的学习路线,决定从Java并发包开始把每个技术、原理、源码做成一个一个系列,由浅入深,由表及里。
这是Java并发包的开篇,我将大致介绍从一个较为宏观的角度来窥探Java并发包,以及这个系列的一些大致思路。
java.util.concurrent从jdk1.5开始新加入的一个包,致力于解决并发编程的线程安全问题,使用户更够更为快捷方便的编写多线程情况下的并发程序。谈到线程安全问题总会免不了几个核心问题:锁、阻塞、原子性、可见性等等。
-java.util.concurrent
-atomic
-locks
…
在concurrent包下还有两个子包,一个是atomic这里面放置的是一些原子类,比如在多线程环境下执行i++的操作实际上是i+1再是将结果赋值给i,这里就会涉及到一个线程安全问题,当一个线程正在执行i+1的时候,很有可能另外一个线程正在读取i的值,这个时候就会造成数据不一致,这是原子性问题。即时一个线程完成了i++的操作,而另外一个线程此时来读取i的值也有可能发现i并不是想加后的值,这是可见性问题。atomic里的AtomInteger就能完美解决原子性和可见性问题。
另一个包是locks,这里面的包可以说是提供了并发包里线程安全的最为基础的工具——显示锁(ReentrantLock、ReadWriteLock)。Java中有synchronized修饰的同步代码块内置锁,但这远远不能满足一些高级特性,例如通过轮询、定时的方式去获得一个锁,并发包中的显示锁的灵活性要高于synchronized,但随之而来的是使用的难度会增加,使用不当则会造成未知的后果。
concurrent包下就是一些并发工具类,常见的有ConcurrentHashMap、ArrayLinkedQueue、LinkedLinkedQueue……这些都是线程安全的类,根据情况不同选取不同的类。
在这个系列的是开始我会首先介绍有关线程的一些基础知识以及专业术语,例如:线程与进程、阻塞与非阻塞、线程安全、原子性、可见性等等,有时候可能会“超纲”,超纲部分做简要阐述。接着会从实例出发分门别类的介绍并发包以及源码,源码以jdk1.7为主,有时可能会设计最新的jdk1.8甚至是jdk1.6,这会特殊标明。最后会对Java并发包做一个总结性的概述。
以上就是Java并发包系列的开篇。如有错误,请留下评论批评指正。
0.Java并发包系列开篇的更多相关文章
- Java容器解析系列(0) 开篇
最近刚好学习完成数据结构与算法相关内容: Data-Structures-and-Algorithm-Analysis 想结合Java中的容器类加深一下理解,因为之前对Java的容器类理解不是很深刻, ...
- Java并发包源码学习系列:CLH同步队列及同步资源获取与释放
目录 本篇学习目标 CLH队列的结构 资源获取 入队Node addWaiter(Node mode) 不断尝试Node enq(final Node node) boolean acquireQue ...
- Java并发包源码学习系列:AQS共享式与独占式获取与释放资源的区别
目录 Java并发包源码学习系列:AQS共享模式获取与释放资源 独占式获取资源 void acquire(int arg) boolean acquireQueued(Node, int) 独占式释放 ...
- Java并发包源码学习系列:ReentrantLock可重入独占锁详解
目录 基本用法介绍 继承体系 构造方法 state状态表示 获取锁 void lock()方法 NonfairSync FairSync 公平与非公平策略的差异 void lockInterrupti ...
- Java并发包源码学习系列:ReentrantReadWriteLock读写锁解析
目录 ReadWriteLock读写锁概述 读写锁案例 ReentrantReadWriteLock架构总览 Sync重要字段及内部类表示 写锁的获取 void lock() boolean writ ...
- Java并发包源码学习系列:详解Condition条件队列、signal和await
目录 Condition接口 AQS条件变量的支持之ConditionObject内部类 回顾AQS中的Node void await() 添加到条件队列 Node addConditionWaite ...
- Java并发包源码学习系列:JDK1.8的ConcurrentHashMap源码解析
目录 为什么要使用ConcurrentHashMap? ConcurrentHashMap的结构特点 Java8之前 Java8之后 基本常量 重要成员变量 构造方法 tableSizeFor put ...
- Java并发包源码学习系列:阻塞队列BlockingQueue及实现原理分析
目录 本篇要点 什么是阻塞队列 阻塞队列提供的方法 阻塞队列的七种实现 TransferQueue和BlockingQueue的区别 1.ArrayBlockingQueue 2.LinkedBloc ...
- Java并发包源码学习系列:阻塞队列实现之ArrayBlockingQueue源码解析
目录 ArrayBlockingQueue概述 类图结构及重要字段 构造器 出队和入队操作 入队enqueue 出队dequeue 阻塞式操作 E take() 阻塞式获取 void put(E e) ...
随机推荐
- css基本布局
一.一列布局 关键代码: { width:960; margin:0 auto: } 代码: 运行结果: 分析:以上代码实现一列布局,头部占整个浏览器 ...
- web console实现
一.效果图 二.实现 web console是基于websocket实现的. 以上做的效果嵌入项目中,因为项目本身是angular1的项目,所以console整体封装成一个angualr modul ...
- POJ2352Stars【树状数组】
Stars Description Astronomers often examine star maps where stars are represented by points on a pla ...
- 【转】一个工具类(可以控制多层嵌套的movieClip)
好多人也应该遇到和我一样的问题,当设计师给了我们一个多层嵌套的movieClip时,我们在写代码时无法将movieClip完全停止掉,主要是基于好多movieClip有深层嵌套,主时间轴不在最上层导致 ...
- C# 快速高效率复制对象另一种方式 表达式树
1.需求 在代码中经常会遇到需要把对象复制一遍,或者把属性名相同的值复制一遍. 比如: public class Student { public int Id { get; set; } publi ...
- fixed应用
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 使用VS2015将解决方案同步更新到Github上
如今开源已经是一种趋势与潮流了,今天就来谈一谈如何将利用VS将我们的解决方案同步更新到Github上. 第一步:登录自己的Github账号(没有的自行注册). 我的Github登录后的界面: 第二步: ...
- 使用Jersey实现图片服务器与应用服务器分离
现在模拟一下Jersey从客户端发送图片到服务器. 1.Tomcat准备 (1)解压一个新的Tomcat作为图片服务器,然后修改端口号(有3处). (2)然 ...
- php判断多维数组的技巧
直接上代码吧: if(count($array) == count($array, 1)){ echo '一维数组'; }else{ echo '多维数组'; } 看了下手册 int count (m ...
- ABPZero中的Name和SurName处理
使用ABPzero的朋友们都知道,User表中有Name和Surname两个字段,这两个字段对于国内的用户来说相当的不友好. 我们在尝试了很多的方法之后,发现无法完美将他们干掉. 所以尝试使用了一个比 ...