JAVA ’ 目录归档

FutureTask 源码解析

版权声明:本文为本作者原创文章,转载请注明出处。感谢 码梦为生| 刘锟洋 的投稿

站在使用者的角度,future是一个经常在多线程环境下使用的Runnable,使用它的好处有两个:
1. 线程执行结果带有返回值
2. 提供了一个线程超时的功能,超过超时时间抛出异常后返回。

那,怎么实现future这种超时控制呢?来看看代码:

F1

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: FutureTask 源码解析


Java Magic. Part 4: sun.misc.Unsafe

原文地址 译文地址 译者:许巧辉 校对:梁海舰

Java是一门安全的编程语言,防止程序员犯很多愚蠢的错误,它们大部分是基于内存管理的。但是,有一种方式可以有意的执行一些不安全、容易犯错的操作,那就是使用Unsafe类。

本文是sun.misc.Unsafe公共API的简要概述,及其一些有趣的用法。
阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java Magic. Part 4: sun.misc.Unsafe


Oracle官方并发教程之执行器(Executors)

原文链接译文链接,译者:Greenster,校对:郑旭东

在之前所有的例子中,Thread对象表示的线程和Runnable对象表示的线程所执行的任务之间是紧耦合的。这对于小型应用程序来说没问题,但对于大规模并发应用来说,合理的做法是将线程的创建与管理和程序的其他部分分离开。封装这些功能的对象就是执行器,接下来的部分将讲详细描述执行器。
阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Oracle官方并发教程之执行器(Executors)


Oracle官方并发教程之同步

原文链接译文链接,译者:蘑菇街-小宝,Greenster李任  校对:丁一,郑旭东,李任

线程间的通信主要是通过共享域和引用相同的对象。这种通信方式非常高效,不过可能会引发两种错误:线程干扰和内存一致性错误。防止这些错误发生的方法是同步。

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Oracle官方并发教程之同步


Oracle官方并发教程之线程池

原文链接译文链接,译者:Greenster,校对:郑旭东

在java.util.concurrent包中多数的执行器实现都使用了由工作线程组成的线程池,工作线程独立于所它所执行的Runnable任务和Callable任务,并且常用来执行多个任务。

使用工作线程可以使创建线程的开销最小化。在大规模并发应用中,创建大量的Thread对象会占用占用大量系统内存,分配和回收这些对象会产生很大的开销。

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Oracle官方并发教程之线程池


Oracle官方并发教程之Executor接口

原文链接译文链接,译者:Greenster,校对:郑旭东

java.util.concurrent中包括三个Executor接口:

  • Executor,一个运行新任务的简单接口。
  • ExecutorService,扩展了Executor接口。添加了一些用来管理执行器生命周期和任务生命周期的方法。
  • ScheduledExecutorService,扩展了ExecutorService。支持Future和定期执行任务。

通常来说,指向Executor对象的变量应被声明为以上三种接口之一,而不是具体的实现类。 阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Oracle官方并发教程之Executor接口


怎么理解Condition

版权声明:本文为本作者原创文章,转载请注明出处。感谢码梦为生| 刘锟洋 的投稿。

在java.util.concurrent包中,有两个很特殊的工具类,Condition和ReentrantLock,使用过的人都知道,ReentrantLock(重入锁)是jdk的concurrent包提供的一种独占锁的实现。它继承自Dong Lea的 AbstractQueuedSynchronizer(同步器),确切的说是ReentrantLock的一个内部类继承了AbstractQueuedSynchronizer,ReentrantLock只不过是代理了该类的一些方法,可能有人会问为什么要使用内部类在包装一层? 我想是安全的关系,因为AbstractQueuedSynchronizer中有很多方法,还实现了共享锁,Condition(稍候再细说)等功能,如果直接使ReentrantLock继承它,则很容易出现AbstractQueuedSynchronizer中的API被误用的情况。
阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 怎么理解Condition


Java 7中的TransferQueue

原文链接译文链接,作者:Alex Miller,译者:Greenster,校对:梁海舰

Java7中加入了JSR 166y规范对集合类和并发类库的改进。其中的一项是增加了接口TransferQueue和其实现类LinkedTransferQueue

TransferQueue继承了BlockingQueueBlockingQueue又继承了Queue)并扩展了一些新方法。BlockingQueue(和Queue)是Java 5中加入的接口,它是指这样的一个队列:当生产者向队列添加元素但队列已满时,生产者会被阻塞;当消费者从队列移除元素但队列为空时,消费者会被阻塞。
阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java 7中的TransferQueue


JUC LinkedBlockingQueue

本文首先发表在 码蜂笔记

java.util.concurrent.LinkedBlockingQueue 是一个基于单向链表的、范围任意的(其实是有界的)、FIFO 阻塞队列。访问与移除操作是在队头进行,添加操作是在队尾进行,并分别使用不同的锁进行保护,只有在可能涉及多个节点的操作才同时对两个锁进行加锁。

队列是否为空、是否已满仍然是通过元素数量的计数器(count)进行判断的,由于可以同时在队头、队尾并发地进行访问、添加操作,所以这个计数器必须是线程安全的,这里使用了一个原子类 AtomicInteger,这就决定了它的容量范围是: 1 – Integer.MAX_VALUE。

由于同时使用了两把锁,在需要同时使用两把锁时,加锁顺序与释放顺序是非常重要的:必须以固定的顺序进行加锁,再以与加锁顺序的相反的顺序释放锁。 阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: JUC LinkedBlockingQueue


JUC ArrayBlockingQueue

本文首先发表在 码蜂笔记

java.util.concurrent.ArrayBlockingQueue 是一个线程安全的、基于数组、有界的、阻塞的、FIFO 队列。试图向已满队列中放入元素会导致操作受阻塞;试图从空队列中提取元素将导致类似阻塞。

此类基于 java.util.concurrent.locks.ReentrantLock 来实现线程安全,所以提供了 ReentrantLock 所能支持的公平性选择。 阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: JUC ArrayBlockingQueue


JUC 可重入 读写锁 ReentrantReadWriteLock

本文首先发表在 码蜂笔记

读写锁 ReadWriteLock

读写锁维护了一对相关的锁,一个用于只读操作,一个用于写入操作。只要没有writer,读取锁可以由多个reader线程同时保持。写入锁是独占的。

互斥锁一次只允许一个线程访问共享数据,哪怕进行的是只读操作;读写锁允许对共享数据进行更高级别的并发访问:对于写操作,一次只有一个线程(write线程)可以修改共享数据,对于读操作,允许任意数量的线程同时进行读取。

与互斥锁相比,使用读写锁能否提升性能则取决于读写操作期间读取数据相对于修改数据的频率,以及数据的争用——即在同一时间试图对该数据执行读取或写入操作的线程数。

读写锁适用于读多写少的情况。 阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: JUC 可重入 读写锁 ReentrantReadWriteLock


Initialization On Demand Holder idiom的实现探讨

SingletonLogoTransparent

起源

程晓明同学的文章“双重检查锁定与延迟初始化”中,提到了对于单例模式的“Initialization On Demand Holder idiom”实现方案。

这个方案的技术实质是利用Java类初始化的LC锁。相比其他实现方案(如double-checked locking等),该技术方案的实现代码较为简洁,并且在所有版本的编译器中都是可行的。该方案代码如下:
阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Initialization On Demand Holder idiom的实现探讨


[Google Guava] 3-缓存

原文地址  译文地址    译者:许巧辉  校对:沈义扬

范例

LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
        .maximumSize(1000)
        .expireAfterWrite(10, TimeUnit.MINUTES)
        .removalListener(MY_LISTENER)
        .build(
            new CacheLoader<Key, Graph>() {
                public Graph load(Key key) throws AnyException {
                    return createExpensiveGraph(key);
                }
        });

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: [Google Guava] 3-缓存


Oracle官方并发教程之中断

原文链接译文链接译者: 蘑菇街-小宝   校对:梁海舰
中断是给线程的一个指示,告诉它应该停止正在做的事并去做其他事情。一个线程究竟要怎么响应中断请求取决于程序员,不过让其终止是很普遍的做法。这是本文重点强调的用法。
阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Oracle官方并发教程之中断


Oracle官方并发教程之不可变对象

原文链接译文链接,译者:Greenster,校对:郑旭东

一个对象如果在创建后不能被修改,那么就称为不可变对象。在并发编程中,一种被普遍认可的原则就是:尽可能的使用不可变对象来创建简单、可靠的代码。
阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Oracle官方并发教程之不可变对象


return top