
Java 7并发源码分析
国山
主要从事软件开发及研发。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java 7之多线程线程池 - 线程池原理(2)
线程池能够复用线程,减少线程创建,销毁,恢复等状态切换的开销,提高程序的性能。一个线程池管理了一组工作线程,同时它还包括了一个用于放置等待执行的任务的队列。ThreadPoolExecutor类中定义了一些与线程状态与活动线程数相关的一些变量,如下:[java] view plain copyprint?private final Atomi转载 2017-03-06 10:36:30 · 271 阅读 · 0 评论 -
Java 7之多线程第5篇 - 原子类
一道面试题:假如有一个文件可以允许多个人同时编辑,如果一个人在编辑完成后进行提交时,另外一个人已经对这个文档进行了修改,这时候就需要提醒下要提交的人,“文档已经修改,是否查看?”最为简单的办法就是:其实原子类大体也是用到这样的思想。在Java.util.concurrent包里包含的主要就是一些与并发实现相关的类,首先来看一下最为基础的原子类(java.util.concu转载 2017-03-06 17:41:45 · 293 阅读 · 0 评论 -
Java 7之多线程第7篇 - 线程锁基础
线程锁是用来实现同步机制的,前面讲到过使用synchronized关键字来实现同步。传送门 - 使用Synchronized关键字实现同步 http://blog.youkuaiyun.com/mazhimazh/article/details/16921255使用这个关键字实现的同步块有一些缺点:(1)锁只有一种类型(2)线程得到锁或者阻塞(3)不能实现很好的并发为了解决如上的各种转载 2017-03-06 17:39:57 · 375 阅读 · 0 评论 -
Java 7之多线程第8篇 - 互斥锁 ReentrantLock
ReentrantLock是一个可重入的互斥锁,又被称为“独占锁”。也就是说ReentrantLock在同一个时间点只能被一个线程获取。Java的synchronized块并不保证尝试进入它们的线程的顺序。因此,如果多个线程不断竞争访问相同的synchronized同步块,就存在一种风险,其中一个或多个线程永远也得不到访问权 —— 也就是说访问权总是分配给了其它线程。这种情况被称作线程饥饿转载 2017-03-06 17:38:41 · 291 阅读 · 0 评论 -
Java 7之多线程第9篇 - 显式的Condition对象
下面这个例子使用synchronized关键字和wait() 、notifyAll()方法实现同步。[java] view plain copyprint?public abstract class BaseBoundedBuffer { private final V[] buf; private int tail;转载 2017-03-06 17:37:28 · 296 阅读 · 0 评论 -
Java 7之多线程第10篇 - Semaphore
Semaphore用于保存当前可用许可的数量。是通过共享锁实现的。根据共享锁的获取原则,Semaphore分为"公平信号量"和"非公平信号量"。"公平信号量"和"非公平信号量"的释放信号量的机制是一样的!不同的是它们获取信号量的机制:线程在尝试获取信号量许可时,对于公平信号量而言,如果当前线程不在队列的头部,则排队等候;而对于非公平信号量而言,无论当前线程是不是在队列的头部,它都会直接获取信号转载 2017-03-06 17:36:25 · 326 阅读 · 0 评论 -
Java 7之多线程第11篇 - 读写锁
ReadWriteLock是ReentrantReadWriteLock的接口,而ReentrantReadWriteLock实现类中包括子类ReadLock和WriteLock。首先来看一下ReadWriteLock接口中方法的定义:[java] view plain copyprint?public interface ReadWriteLo转载 2017-03-06 17:35:03 · 261 阅读 · 0 评论 -
Java 7之多线程第12篇 - CountDownLatch
CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。来看一下这个类的构造方法,如下:[java] view plain copyprint?public CountDownLatch(int count) { if (count 0) throw new Illega转载 2017-03-06 17:33:50 · 306 阅读 · 0 评论 -
Java 7之多线程 - 线程的取消与关闭
Java没有一种安全的抢占式方法来停止线程,只有一些协作式机制。其中一种协作机制能设置某个“已请求取消”标志,而任务将定期查看该标志。如果设置了这个标志,那么任务将提前结束。举例如下:[java] view plain copyprint?public class PrimeGenerator implements Runnable { p转载 2017-03-06 17:31:39 · 379 阅读 · 0 评论 -
ThreadLocal变量
在做ThreadLocal时遇到了一件特别郁闷的事。因为ThreadLocal是线程独享的,但是我在做程序开发时却遇到一个问题,就是ThreadLocal里总是有另外一个线程插入的数据。最后终于发现,原来启动的两个线程都是main线程,不知道为什么。。。。。。。。。clean项目,重启MyEclipse后,问题解决了。。。。。。。。。。紧接着又一件郁闷事来了。在使用线程池时,如果某转载 2017-03-06 17:29:06 · 362 阅读 · 0 评论 -
Java之多线程易范错误
[html] view plain copyprint?public class mainTestImpl { /* * 任何线程一般具有五种状态,即创建、就绪、运行、阻塞、终止 线程 调用stop()方法时或run()方法执行 * 结束后,线程即处于死亡状态。 处于死亡状态的线程不具有继续运行的能力。 */转载 2017-03-06 17:27:44 · 315 阅读 · 0 评论 -
线程异步
[html] view plain copyprint?private void executeAndWait(SimpleAsyncTaskExecutor executor, Runnable task, Object monitor) { synchronized (monitor) { executor.execu转载 2017-03-06 17:26:28 · 315 阅读 · 0 评论 -
Java 7之多线程并发容器 - CopyOnWriteArrayList
CopyOnWriteArrayList相当于线程安全的ArrayList,通过增加写时复制语义来实现线程安全性。底层也是通过一个可变数组来实现的。但是和ArrayList不同的时,它具有以下特性: 它最适合于具有以下特征的应用程序:List 大小通常保持很小,只读操作远多于可变操作,需要在遍历期间防止线程间的冲突 支持高效率并发且是线程安全的 因为通常需要复制整个基础数组,所以可变操作(转载 2017-03-06 17:23:53 · 371 阅读 · 0 评论 -
Java 7之多线程并发容器 - ConcurrentHashMap
与HashMap一样,ConcurrentHashMap也是一个基于散列的Map,但是它使用了锁分段的技术来提供更高的并发性和伸缩性。锁分段就是进一步对一组独立的对象进行分解。例如,在ConcurrentHashMap的实现中使用了一个包含16个锁的数组,每个锁保护所有散列桶的1/16,其实第N个散列桶由第(N mod 16)个锁来保护。所以这个并发集合可以支持多达16个并发的写入器。首先转载 2017-03-06 17:22:07 · 337 阅读 · 0 评论 -
Java 7之多线程并发容器 - ArrayBlockingQueue
Java中有些多线程编程模式在很大程序上都依赖于Queue实现的线程安全性,所以非常有必要认识,首先来看一下接口定义,如下:[java] view plain copyprint?public interface Queue extends Collection { // 向队列中添加元素 boolean add(E e);转载 2017-03-06 17:21:04 · 325 阅读 · 0 评论 -
Java 7之多线程并发容器 - LinkedBlockingQueue
LinkedBlockingQueue是一个单向链表实现的阻塞队列。该队列按 FIFO(先进先出)排序元素,新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低。此外,LinkedBlockingQueue还是可选容量的(防止过度膨胀),即可以指定队列的容量。如果不指定,默认容量大小等于Int转载 2017-03-06 17:17:53 · 265 阅读 · 0 评论 -
Java 7之多线程线程池 - Callable和Future
Callable接口代表一段可以调用并返回结果的代码;Future接口表示异步任务,是还没有完成的任务给出的未来结果。所以说Callable用于产生结果,Future用于获取结果。 Java 5在concurrency包中引入了Java.util.concurrent.Callable 接口,它和Runnable接口很相似,但它可以返回一个对象或者抛出一个异常。 Cal转载 2017-03-06 11:26:59 · 403 阅读 · 0 评论 -
Java 7之多线程线程池 - 线程池原理(1)
Java 7之多线程线程池 - 线程池原理(1)2014-02-15 16:30 15458人阅读 评论(7)收藏举报本文章已收录于:分类: Java 7并发源码分析(18) 作者同类文章X版权声明:本文为博主原创文章,未经博主允许不得转载。来看一下线程池的框架图,如下:转载 2017-03-06 10:55:32 · 332 阅读 · 0 评论 -
数组与集合
1、拷贝之Java.lang.System.arraycopy和java.util.Arrays.copyOf方法Java数组的复制操作可以分为深复制和浅复制。一般对于引用类型的数组来说,需要在某些时候进行深复制。 首先来看一下两个方法实现的源代码,如下:[java] view plain copyprin转载 2017-03-06 17:43:19 · 340 阅读 · 0 评论