
java并发编程
文章平均质量分 96
rickiyang
这个作者很懒,什么都没留下…
展开
-
java并发编程(三)----线程的同步
在现实开发中,我们或多或少的都经历过这样的情景:某一个变量被多个用户并发式的访问并修改,如何保证该变量在并发过程中对每一个用户的正确性呢?今天我们来聊聊线程同步的概念。一般来说,程序并行化是为了获得更高的执行效率,但前提是,高效率不能以牺牲正确性为代价。如果程序并行化后, 连基本的执行结果的正确性都无法保证, 那么并行程序本身也就没有任何意义了。因此, 线程安全就是并行程序的根本和根基。解决这些问题原创 2016-12-22 22:24:38 · 1016 阅读 · 0 评论 -
java并发编程(二十三)----(JUC集合)ConcurrentSkipListMap介绍
ConcurrentSkipListMap提供了一种线程安全的并发访问的排序映射表。内部是SkipList(跳表)结构实现,在理论上能够在O(log(n))时间内完成查找、插入、删除操作。理解SkipList要想弄明白ConcurrentSkipListMap,我们的先明白他的数据结构实现,先来看SkipList。Skip List是一种随机化的数据结构,基于并联的链表,其效率可比拟于二叉查找树(对原创 2017-02-27 21:45:16 · 684 阅读 · 0 评论 -
java并发编程(十五)----(线程池)java线程池简介
好的软件设计不建议手动创建和销毁线程。线程的创建和销毁是非常耗 CPU 和内存的,因为这需要 JVM 和操作系统的参与。64位 JVM 默认线程栈是大小1 MB。这就是为什么说在请求频繁时为每个小的请求创建线程是一种资源的浪费。线程池可以根据创建时选择的策略自动处理线程的生命周期。重点在于:在资源(如内存、CPU)充足的情况下,线程池没有明显的优势,否则没有线程池将导致服务器崩溃。有很多的理由可以解原创 2017-01-19 21:42:13 · 992 阅读 · 0 评论 -
java并发编程(二十四)----(JUC集合)ArrayBlockingQueue和LinkedBlockingQueue介绍
这一节我们来了解阻塞队列(BlockingQueue),BlockingQueue接口定义了一种阻塞的FIFO queue,每一个BlockingQueue都有一个容量,当容量满时往BlockingQueue中添加数据时会造成阻塞,当容量为空时取元素操作会阻塞。首先我们来看ArrayBlockingQueue和LinkedBlockingQueue.ArrayBlockingQueueArrayBl原创 2017-02-28 21:42:24 · 607 阅读 · 0 评论 -
java并发编程(十六)----(线程池)java线程池的使用
上节我们简单介绍了线程池,这次我们就来使用一下。Executors提供四种线程池,分别是:newCachedThreadPool,newFixedThreadPool ,newScheduledThreadPool ,newSingleThreadExecutor 。下面我们分别来使用下。1. newSingleThreadExecutor创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是原创 2017-01-21 23:25:25 · 860 阅读 · 0 评论 -
java并发编程(十八)----(线程池)java线程池框架Fork-Join
还记得我们在初始介绍线程池的时候提到了Executor框架的体系,到现在为止我们只有一个没有介绍,与ThreadPoolExecutor一样继承与AbstractExecutorService的ForkJoinPool.Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。我们通过表面的意思去理解For原创 2017-02-20 21:02:12 · 1173 阅读 · 0 评论 -
java并发编程(十七)----(线程池)java线程池架构和原理
前面我们简单介绍了线程池的使用,但是对于其如何运行我们还不清楚,Executors为我们提供了简单的线程工厂类,但是我们知道ThreadPoolExecutor是线程池的具体实现类。我们先从他开始分析。1. ThreadPoolExecutor初探ThreadPoolExecutor一共有3个构造方法,我们来看一下其中看起来比较复杂的这个:public ThreadPoolExec原创 2017-01-23 18:01:04 · 665 阅读 · 0 评论 -
java并发编程(十九)----(JUC集合)总体框架介绍
本节我们将继续学习JUC包中的集合类,我们知道jdk中本身自带了一套非线程安全的集合类,我们先温习一下java集合包里面的集合类,然后系统的看一下JUC包里面的集合类到底有什么不同。java集合类java集合类里面主要包含两大类:一类是Collection接口下的List、Set和Queue接口,一类是Map接口。List的主要实现类包括:ArrayList:数组实现的队列,它是一个动态数组;它不是原创 2017-02-23 17:13:31 · 4441 阅读 · 0 评论 -
java并发编程(二十)----(JUC集合)CopyOnWriteArrayList介绍
这一节开始我们正式来介绍JUC集合类。我们按照List、Set、Map、Queue的顺序来进行介绍。这一节我们来看一下CopyOnWriteArrayList。CopyOnWriteArrayList介绍CopyOnWriteArrayList是ArrayList 的一个线程安全的变体,其中所有可变操作(add、set 等等)都是通过对底层数组进行一次新的复制来实现的。 与ArrayList不同处就原创 2017-02-23 17:16:42 · 766 阅读 · 0 评论 -
java并发编程(二十五)----(JUC集合)LinkedBlockingDeque和ConcurrentLinkedDeque介绍
Queue除了前面介绍的实现外,还有一种双向的Queue实现Deque。这种队列允许在队列头和尾部进行入队出队操作,因此在功能上比Queue显然要更复杂。LinkedBlockingDeque我们来看一下该类中的成员变量:public class LinkedBlockingDeque<E> extends AbstractQueue<E> implements Bl原创 2017-03-02 23:45:33 · 2036 阅读 · 0 评论 -
java并发编程(二十一)----(JUC集合)CopyOnWriteArraySet和ConcurrentSkipListSet介绍
这一节我们来接着介绍JUC集合:CopyOnWriteArraySet和ConcurrentSkipListSet。从名字上来看我们知道CopyOnWriteArraySet与上一节讲到的CopyOnWriteArrayList一样是动态数组实现;ConcurrentSkipListSet是线程安全的有序的集合,适用于高并发的场景。下面我们深入细致的分析一下他们的用法。CopyOnWriteArra原创 2017-02-26 10:35:20 · 3876 阅读 · 0 评论 -
java并发编程(二十二)----(JUC集合)ConcurrentHashMap介绍
这一节我们来看一下并发的Map,ConcurrentHashMap和ConcurrentSkipListMap。ConcurrentHashMap通常只被看做并发效率更高的Map,用来替换其他线程安全的Map容器,比如Hashtable和Collections.synchronizedMap。ConcurrentSkipListMap提供了一种线程安全的并发访问的排序映射表。内部是SkipList(原创 2017-02-26 10:40:40 · 675 阅读 · 0 评论 -
java并发编程(十四)----(JUC原子类)对象的属性修改类型介绍
今天我们介绍原子类的最后一个类型—-对象的属性修改类型: AtomicIntegerFieldUpdater,AtomicLongFieldUpdater,AtomicReferenceFieldUpdater。有了这几个方法,普通的变量也能享受原子操作了。1. 开胃菜由API我们知道AtomicIntegerFieldUpdater,AtomicLongFieldUpdater,AtomicRef原创 2017-01-17 22:13:53 · 1165 阅读 · 0 评论 -
java并发编程(十一)----(JUC原子类)基本类型介绍
上一节我们说到了基本原子类的简单介绍,这一节我们先来看一下基本类型: AtomicInteger, AtomicLong, AtomicBoolean。AtomicInteger和AtomicLong的使用方法差不多,AtomicBoolean因为比较简单所以方法比前两个都少,那我们这节主要挑AtomicLong来说,会使用一个,其余的大同小异。1.原子操作与一般操作异同我们在说原子操作之前为了有个原创 2017-01-12 22:44:27 · 1603 阅读 · 0 评论 -
java并发编程(二)----创建并运行java线程
实现线程的两种方式上一节我们了解了关于线程的一些基本知识,下面我们正式进入多线程的实现环节。实现线程常用的有两种方式,一种是继承Thread类,一种是实现Runnable接口。当然还有第三种方式,那就是通过线程池来生成线程,后面我们还会学习,一步一个脚印打好基础。 Runnable接口:public interface Runnable { public abstract void run原创 2016-12-14 22:18:42 · 848 阅读 · 0 评论 -
java并发编程(一)----线程基础知识
java并发编程<1>—-线程基础知识在任何的生产环境中我们都不可逃避并发这个问题,多线程作为并发问题的技术支持让我们不得不去了解。这一块知识就像一个大蛋糕一样等着我们去分享,抱着学习的心态,记录下自己对并发的认识。线程状态图: 1、新建状态(New):新创建了一个线程对象。 2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线原创 2016-12-14 21:50:58 · 1228 阅读 · 1 评论 -
java并发编程(七)----(JUC)ReadWriteLock
前面我们已经分析过JUC包里面的Lock锁,ReentrantLock锁和semaphore信号量机制。Lock锁实现了比synchronized更灵活的锁机制,Reentrantlock是Lock的实现类,是一种可重入锁,都是每次只有一次线程对资源进行处理;semaphore实现了多个线程同时对一个资源的访问;今天我们要讲的ReadWriteLock锁将实现另外一种很重要的功能:读写分离锁。假设你原创 2017-01-07 21:35:36 · 819 阅读 · 0 评论 -
java并发编程(四)----(JUC)Lock锁初探
首先我们来回忆一下上一节讲过的synchronized关键字,该关键字用于给代码段或方法加锁,使得某一时刻它修饰的方法或代码段只能被一个线程访问。那么试想,当我们遇到这样的情况:当synchronized修饰的方法或代码段因为某种原因(IO异常或是sleep方法)被阻塞了,但是锁有没有被释放,那么其他线程除了等待以外什么事都做不了。当我们遇到这种情况该怎么办呢?我们今天讲到的Lock锁将有机会为此行原创 2016-12-26 21:39:15 · 1926 阅读 · 0 评论 -
java并发编程(五)----(JUC)ReentrantLock
上一节我们了解了Lock接口的一些简单的说明,知道Lock锁的常用形式,那么这节我们正式开始进入JUC锁(java.util.concurrent包下的锁,简称JUC锁)。下面我们来看一下Lock最常用的实现类ReentrantLock。1.ReentrantLock简介由单词意思我们可以知道这是可重入的意思。那么可重入对于锁而言到底意味着什么呢?简单来说,它有一个与锁相关的获取计数器,如果拥有锁的原创 2016-12-29 21:54:19 · 1148 阅读 · 0 评论 -
java并发编程(六)----(JUC)Semaphore
Semaphore,从字面意义上我们知道他是信号量的意思。在java中,一个计数信号量维护了一个许可集。Semaphore 只对可用许可的号码进行计数,并采取相应的行动。拿到信号量的线程可以进入代码,否则就等待。通过acquire()和release()获取和释放访问许可。信号量Semaphore是一个控制访问多个共享资源的计数器,它本质上是一个“共享锁”。Java并发提供了两种加锁模式:共享锁和独原创 2017-01-04 22:11:35 · 838 阅读 · 0 评论 -
java并发编程(十二)----(JUC原子类)数组类型介绍
上一节我们介绍过三个基本类型的原子类,这次我们来看一下数组类型: AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray。其中前两个的使用方式差不多,AtomicReferenceArray因为他的参数为引用数组,所以跟前两个的使用方式有所不同。1.AtomicLongArray介绍对于AtomicLongArray, AtomicInte原创 2017-01-13 21:37:49 · 719 阅读 · 0 评论 -
java并发编程(十三)----(JUC原子类)引用类型介绍(CAS和ABA的介绍)
这一节我们将探讨引用类型原子类:AtomicReference, AtomicStampedRerence, AtomicMarkableReference。AtomicReference的使用非常简单,根据API我们就可以知道如何用,但是后两个从名字上我们就知道那是相当棘手哈。但是也不要怕,就让我们一起来克服困难吧。1.AtomicReference简介AtomicReference的使用非常简单原创 2017-01-15 16:18:28 · 1805 阅读 · 0 评论 -
java并发编程(八)----(JUC)CountDownLatch
CountDownLatch 是一个非常实用的多线程控制工具类。” Count Down ” 在英文中意为倒计数, Latch 为门问的意思。如果翻译成为倒计数门阀, 我想大家都会觉得不知所云吧! 因此,这里简单地称之为倒计数器。在这里, 门问的含义是:把门锁起来,不让里面的线程跑出来。因此,这个工具通常用来控制线程等待,它可以让某一个线程等待直到倒计时结束, 再开始执行。CountDown Lat原创 2017-01-10 23:24:08 · 913 阅读 · 0 评论 -
java并发编程(九)----(JUC)CyclicBarrier
上一篇我们介绍了CountDownlatch,我们知道CountDownlatch是“在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待”,即CountDownLatch的作用是允许1或N个线程等待其他线程完成执行,而我们今天要介绍的CyclicBarrier则是允许N个线程相互等待。1.CyclicBarrier简介CyclicBarrier 的字面意思是可循环使用(Cyclic原创 2017-01-11 23:19:57 · 710 阅读 · 0 评论 -
java并发编程(十)----JUC原子类介绍
今天我们来看一下JUC包中的原子类,所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程),原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割而只执行其中的一部分。 将整个操作视作一个整体是原子性的核心特征。在atomic包中的这些原子类我们可以大致给他分类为:基本类型原创 2017-01-12 21:32:11 · 680 阅读 · 0 评论 -
java并发编程(二十六)----ThreadLocal的使用
其实ThreadLocal很多接触过多线程的同学都可能会很陌生,他不像current包里面那些耳熟能详的api一样在我们面前经常出现,更多的他作为一个本地类出现在系统设计里面。我们可以说一下Spring,Spring的事务管理器通过AOP切入业务代码,在进入业务代码前,会根据对应的事务管理器提取出相应的事务对象,假如事务管理器是DataSourceTransactionManager,就会从Data原创 2017-06-21 00:23:34 · 1399 阅读 · 0 评论