并发技术
文章平均质量分 82
「已注销」
这个作者很懒,什么都没留下…
展开
-
Java中的锁——重入锁ReentrantLock
ReentrantLock 是一种支持支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁,除此之外,该锁还支持获取锁的公平性和非公平性选择。1 重入的实现对于锁的重入,我们来想这样一个场景。当一个递归方法被sychronized关键字修饰时,在调用方法时显然没有发生问题,执行线程获取了锁之后仍能连续多次地获得该锁,也就是说sychronized关键字支持锁的重入。对于Reentr原创 2015-12-20 14:48:00 · 4059 阅读 · 0 评论 -
Java中的锁——队列同步器
队列同步器AbstractQueuedSynchronizer(AQS),似乎我们不经常用,但是它是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。下图显示了java.concurrent包的实现示意图同步器的主要使用方式是继承,一般作为同步器组件的静态内部类,在同步器中仅定义了与状态相关的方法,且这个状原创 2015-12-20 13:27:12 · 8165 阅读 · 10 评论 -
Synchronized与三种锁态
介绍Sychronized的锁实现原理以及三种锁态(偏向锁、轻量级锁和重量级锁)的关系原创 2015-12-17 20:53:38 · 8196 阅读 · 0 评论 -
Java中的锁——ReentrantReadWriteLock(读写锁)
上一篇里讲的ReentrankLock是一种排他锁,即同一时间只能有一个线程进入。而读写锁在同一时刻允许多个读线程访问,但是在写线程访问时,所有的读线程和其他线程均被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读写锁,使得并发性比一般的排它锁有了很大提升。因为大多数应用场景都是读多于写的,因此在这样的情况下,读写锁可以提高吞吐量。下图描述了关于读写锁的三个特性:公平性、重入性和锁降级。原创 2015-12-21 10:07:12 · 3031 阅读 · 3 评论 -
Java中的线程池——ThreadPoolExecutor的使用
开发过程中,合理地使用线程池可以带来3个好处:降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性:线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。1 线程池的创建ThreadPoolExecutor有原创 2015-12-22 14:18:43 · 45414 阅读 · 3 评论 -
Java中的线程池——ThreadPoolExecutor的原理
1 线程池的处理流程向线程池提交一个任务后,它的主要处理流程如下图所示一个线程从被提交(submit)到执行共经历以下流程:线程池判断核心线程池里是的线程是否都在执行任务,如果不是,则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下一个流程线程池判断工作队列是否已满。如果工作队列没有满,则将新提交的任务储存在这个工作队列里。如果工作队列满了,则进入下原创 2015-12-22 19:59:42 · 9249 阅读 · 0 评论 -
Java中的线程池——Executor框架
1 Executor框架简介我们通常创建的Java线程它既是工作单元,又是执行机制。每创建一个任务就需要一个新建一个线程来执行,这样会极大的消耗系统资源。从JDK5开始,把工作单元和执行分离开,工作单元变为Runable和Callable,而执行机制就是Executor框架。Executor框架的类与接口图如下2 框架的结构Executor框架主要由3大原创 2015-12-23 13:28:24 · 1726 阅读 · 0 评论 -
Java中的线程池——3种常用的ThreadPoolExecutor
在Executor框架下,利用Executors的静态方法可以创建三种类型的常用线程池。他们可分别对应不同的应用场景,下面来看看这三个线程池。1 FixedThreadPool这个线程池可以创建固定线程数的线程池。它的构造源码如下:public static ExecutorService newFixedThreadPool(int nThreads) { r原创 2015-12-24 09:25:22 · 7633 阅读 · 4 评论 -
并发的单例陷阱
1 并发的单例是什么样的1.1 单机的singleton 1.0在编程的时候,我们会用到单例模式,尤其是一些工具类或数据库连接类常常是单例的。因为他们经常被使用,重复的初始化成本又比较高,因此写成单例模式的。我们都知道单例只有一个对象存在,通常会写成下面这种形式。public class SingletonCommon{ private static SingletonCom原创 2015-11-22 22:37:42 · 3039 阅读 · 0 评论