
Java并发编程
零度anngle
情商不是八面玲珑的圆滑,而是德行具足后的虚心、包容和自信;成熟不是单纯到复杂的世故,而是复杂回归简单的超然;觉悟不是对世事的无所谓,而是对无能为力之事的坦然接受;成功不是追求别人眼中的最好,而是把自己能做的事情做得最好。热爱生活,热爱编程,热爱Java,喜欢探索,纸上得来终觉浅,绝知此事要躬行,愿与你一起在技术的海洋中成长!
博客:http://blog.csdn.net/zmx729618
展开
-
JAVA多线程实现的四种方式以示例
原文出处:https://www.cnblogs.com/felixzh/p/6036074.htmlJava多线程实现方式主要有四种:继承Thread类、实现Runnable接口、实现Callable接口通过FutureTask包装器来创建Thread线程、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,后两种是带...转载 2018-02-28 14:15:56 · 2474 阅读 · 0 评论 -
ThreadPoolExecutor使用和思考(二)-keepAliveTime及拒绝策略
通过上篇文章,我们可以总结出:ThreadPoolExecutor中额定的“工人”数量由corePoolSize决定,当任务数量超过额定工人数量时,将任务缓存在BlockingQueue之中,当发现如果连queue中也放不下时(可能是因为使用有界queue,也可能是使用SynchronousQueue),ThreadPoolExecutor会请求“老板”再派几个“工人”过来。接下来发生原创 2017-03-28 14:08:01 · 3805 阅读 · 0 评论 -
ThreadPoolExecutor使用和思考(一)-线程池大小设置与BlockingQueue的三种实现区别
工作中多处接触到了ThreadPoolExecutor。趁着现在还算空,学习总结一下。前记:jdk官方文档(javadoc)是学习的最好,最权威的参考。文章分上中下。上篇中主要介绍ThreadPoolExecutor接受任务相关的两方面入参的意义和区别,池大小参数corePoolSize和maximumPoolSize,BlockingQueue选型(SynchronousQueu转载 2017-03-28 10:30:41 · 1334 阅读 · 0 评论 -
Promise模式简介(Future) -Java实现异步
Promise模式简介Promise模式是一种异步编程模式 。它使得我们可以先开始一个任务的执行,并得到一个用于获取该任务执行结果的凭据对象,而不必等待该任务执行完毕就可以继续执行其他操作。等到我们需要该任务的执行结果时,再调用凭据对象的相关方法来获取。这样就避免了不必要的等待,增加了系统的并发性。这好比我们去小吃店,同时点了鸭血粉丝汤和生煎包。当我们点餐付完款后,我们拿到手的其实只是一张可借转载 2017-01-19 17:37:11 · 7775 阅读 · 1 评论 -
java并发编程-Executor框架+Future
Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。他们的关系为:并发编程的一种编程方式是把任务拆分为一些列的小任务,即Runnable,然后在提交给一个Executor执行,Execu转载 2017-02-09 11:42:18 · 647 阅读 · 0 评论 -
Java中 CopyOnWriteArrayList 的使用
java中,List在遍历的时候,如果被修改了会抛出java.util.ConcurrentModificationException错误。看如下代码:[java] view plain copy print?import java.util.ArrayList; import java.util.List; public class Resou转载 2016-11-22 17:31:44 · 430 阅读 · 0 评论 -
ConcurrentHashMap Collections.synchronizedMap和Hashtable讨论
在Java类库中出现的第一个关联的集合类是Hashtable,它是JDK1.0的一部分。 Hashtable提供了一种易于使用的、线程安全的、关联的map功能,这当然也是方便的。然而,线程安全性是凭代价换来的――Hashtable的所有方法都是同步的。此时,无竞争的同步会导致可观的性能代价。Hashtable的后继者HashMap是作为JDK1.2中的集合框架的一部分出现的,它通过提供一个不同步的转载 2016-11-22 16:37:38 · 1110 阅读 · 0 评论 -
CountDownLatch和CyclicBarrier介绍
概述JDK中提供了一些用于线程之间协同等待的工具类,CountDownLatch和CyclicBarrier就是最典型的两个线程同步辅助类。下面分别详细介绍这两个类,以及他们之间的异同点。CountDownLatch类CountDownLatch顾名思义:倒计数锁存器。没错,他就是一个计数器,并且是倒着计数的。他的应用场景如下:一个任务A,他需要等待其他的一些任转载 2016-11-01 16:42:33 · 331 阅读 · 0 评论 -
DelayQueue的运用
在学习Java 多线程并发开发过程中,了解到DelayQueue类的主要作用:是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。注意:不能将null元素放置到这种队列中。Delayed,一种混合风格的接口,用来标记那些应该在给定延迟时间之后执行的对象。此接口的实现必须定义转载 2016-10-31 11:10:29 · 555 阅读 · 0 评论 -
SynchronousQueue的使用
SynchronousQueue是这样一种阻塞队列,其中每个 put 必须等待一个 take,反之亦然。同步队列没有任何内部容量,甚至连一个队列的容量都没有。 不能在同步队列上进行 peek,因为仅在试图要取得元素时,该元素才存在; 除非另一个线程试图移除某个元素,否则也不能(使用任何方法)添加元素;也不能迭代队列,因为其中没有元素可用于迭代。队列的头是尝试翻译 2016-10-31 10:30:40 · 14416 阅读 · 2 评论 -
并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出)。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。注:什么叫线程安全?这个首先要明确。线程安全就是说多线程访问同转载 2016-10-31 09:33:44 · 810 阅读 · 0 评论 -
LinkedBlockingQueue的put,add跟offer的区别
LinkedBlockingQueue顾名思义这是一个阻塞的线程安全的队列,底层应该采用链表实现。看其API的时候发现,添加元素的方法竟然有三个:add,put,offer。且这三个方法都是向队列尾部添加元素的意思。于是我产生了兴趣,要仔细探究一下他们之间的差别。1.首先看一下add方法:[java] view plain copy print?Inse转载 2016-10-31 09:18:19 · 3185 阅读 · 0 评论 -
优先队列PriorityQueue的使用
优先级队列PriorityQueue是从JDK1.5开始提供的新的数据结构接口,优先级队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。如果不提供Comparator的话,优先队列中元素默认按自然顺序排列,也就是数字默认是小的在队列头,字符串则按字典序排列。由于网上的资料大多将优先级队列各个方法属性,很少有实例讲解的,为方便大家以后使用,我就写了个使用实例供参考。如果原创 2016-10-28 17:37:40 · 1189 阅读 · 0 评论 -
探索ConcurrentHashMap高并发性的实现机制
简介ConcurrentHashMap 是 util.concurrent 包的重要成员。本文将结合 Java 内存模型,分析 JDK 源代码,探索 ConcurrentHashMap 高并发的具体实现机制。由于 ConcurrentHashMap 的源代码实现依赖于 Java 内存模型,所以阅读本文需要读者了解 Java 内存模型。同时,ConcurrentHashMap 的源代转载 2016-10-28 16:49:01 · 406 阅读 · 0 评论 -
阻塞队列BlockingQueue使用
BlockingQueue的原理及方法:BlockingQueue最终会有四种状况,抛出异常、返回特殊值、阻塞、超时,下表总结了这些方法: 抛出异常特殊值阻塞超时插入add(e)offer(e)put(e)offer(e, time, unit)移除remove()poll()take()poll(转载 2016-10-28 15:40:50 · 1104 阅读 · 0 评论 -
Java线程:CAS浅析
前言 在Java并发包中有这样一个包,java.util.concurrent.atomic,该包是对Java部分数据类型的原子封装,在原有数据类型的基础上,提供了原子性的操作方法,保证了线程安全。下面以AtomicInteger为例,来看一下是如何实现的。[java] view plain copy print?public fin转载 2017-03-28 14:11:42 · 452 阅读 · 0 评论 -
java并发编程实战笔记
每一个想学习Java多线程的人,手里至少有这本书或者至少要看这本书,2012年在看这本书的时候,当时正开发支付平台的后台应用,正好给了我大量的实践机会。强烈建议大家多看几遍。代码中比较容易出现 bug 的场景:不一致的同步,直接调用 Thread.run ,未被释放的锁,空的同步块,双重检查加锁,在构造函数中启动一个线程, notify 或 notifyAll 通知错误, Obje转载 2017-04-11 09:40:55 · 914 阅读 · 0 评论 -
java线程同步的三种方法[synchronized关键字,Lock加锁,信号量Semaphore]
java多线程的难点是在:处理多个线程同步与并发运行时线程间的通信问题。java在处理线程同步时,常用方法有:1、synchronized关键字。2、Lock显示加锁。3、信号量Semaphore。 线程同步问题引入: 创建一个银行账户Account类,在创建并启动100个线程往同一个Account类实例里面添加一块钱。在没有使用上面三种方法的情况下:代码:转载 2017-04-01 15:10:17 · 3854 阅读 · 0 评论 -
Java并发之volatile关键字深入解析
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来转载 2017-11-16 10:58:11 · 479 阅读 · 0 评论 -
并发编程实现模型之(三)Producer-Consumer模式
生产者-消费模式,通常有两类线程,即若干个生产者线程和若干个消费者线程。生产者线程负责提交用户请求,消费者线程负责具体处理生产者提交的任务。两者之间通过共享内存缓冲去进行通信。一、架构模式图:类图:生产者:提交用户请求,提取用户任务,并装入内存缓冲区;消费者:在内存缓冲区中提取并处理任务;内存缓冲区:缓存生产者提交的任务或数据,供消费者使用;任务:生产者向内存缓冲区转载 2017-11-13 10:27:00 · 3084 阅读 · 0 评论 -
Java的Unsafe类及compareAndSwap浅析
最近在看jdk7中java.util.concurrent下面的源码中,发现许多类中使用了Unsafe类中的方法来保证并发的安全性,而java 7 api中并没有这个类的相关介绍,在网上查了许多资料,其中http://ifeve.com/sun-misc-unsafe/这个网站详细的讲解了Unsafe的相关用法,而下面是结合网站中的介绍和具体的AtomicInteger类来讲解一下其相关的用法。转载 2017-11-14 10:55:06 · 4671 阅读 · 0 评论 -
并发编程实现模型之(二)Master-Worker模式
Master-Worker模式是常用的并行模式之一,它的核心思想是,系统有两个进程协作工作:Master进程,负责接收和分配任务;Worker进程,负责处理子任务。当Worker进程将子任务处理完成后,结果返回给Master进程,由Master进程做归纳汇总,最后得到最终的结果。一、什么是Master-Worker模式:该模式的结构图: 结构图:转载 2017-11-10 14:21:15 · 565 阅读 · 0 评论 -
并发编程实现模型之(一)Future模式
多线程开发可以更好的发挥多核cpu性能,常用的多线程设计模式有:Future、Master-Worker、Guard Susperionsion、不变、生产者-消费者 模式;jdk除了定义了若干并发的数据结构,也内置了多线程框架和各种线程池; 锁(分为内部锁、重入锁、读写锁)、ThreadLocal、信号量等在并发控制中发挥着巨大的作用。本篇介绍第一种并发编程实现模型——Future模型。转载 2017-11-10 09:42:17 · 668 阅读 · 0 评论 -
java锁机制:synchronized/lock(Condition)
1、synchronized把代码块声明为 synchronized,有两个重要后果,通常是指该代码具有原子性(atomicity)和 可见性(visibility)。1.1 原子性原子性意味着个时刻,只有一个线程能够执行一段代码,这段代码通过一个monitor object保护。从而防止多个线程在更新共享状态时相互冲突。1.2 可见性可见性则更为微妙,它要对付转载 2017-09-05 16:15:38 · 1745 阅读 · 0 评论 -
JAVA CAS原理深度分析
java.util.concurrent包完全建立在CAS之上的,没有CAS就不会有此包。可见CAS的重要性。CASCAS:Compare and Swap, 翻译成比较并交换。 java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁。本文先从CAS的应用说起,再深入原理解析。 CAS应用CAS有3个操作数,转载 2017-09-05 13:30:24 · 363 阅读 · 0 评论 -
synchronized和lock的实现原理
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea。本文并不比较synchronized与Lock孰优孰劣,只是介绍二者的实现原理。数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CPU指令,大家转载 2017-09-05 10:51:42 · 2152 阅读 · 1 评论 -
并发容器之CopyOnWriteArrayList及与其他容器对比
一、 CopyOnWriteArrayList原理 Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWrit转载 2017-09-04 11:40:35 · 1436 阅读 · 0 评论 -
ScheduledExecutorService中scheduleAtFixedRate方法同步
由于ScheduledExecutorServices.cheduleAtFixedRate是指定频率执行方法,若方法的执行时间大于指定的间隔时间,将可能会发生,同一时间点 ,执行方法N 次。所以需要使用同步方法才确保并发操作的安全性。import java.util.concurrent.Executors; import java.util.concurrent.ScheduledE转载 2016-05-20 11:25:11 · 4402 阅读 · 0 评论 -
BlockingQueue的基本原理
1. 前言BlockingQueue即阻塞队列,它算是一种将ReentrantLock用得非常精彩的一种表现,依据它的基本原理,我们可以实现Web中的长连接聊天功能,当然其最常用的还是用于实现生产者与消费者模式,大致如下图所示: 在Java中,BlockingQueue是一个接口,它的实现类有ArrayBlockingQueue、DelayQueue、 LinkedBloc转载 2017-04-12 10:44:10 · 662 阅读 · 0 评论 -
ReentrantLock使用详解(3)之测试锁与超时
我在上面的这篇博客中,曾经写到过线程在获取锁的过程中是无法中断的。但是ReentrantLock提供了tryLock()、tryLock(long timeout, TimeUnit unit)、lock.lockInterruptibly()tryLock() 方法试图申请一个锁,在成功获得锁后返回true,否则,立即返回false,而且线程可以立即离开去做其他的事情。try转载 2017-04-12 10:23:59 · 5551 阅读 · 0 评论 -
ReentrantLock使用详解(1)之lock/unlock
在大多数实际的多线程应用中,两个或两个以上的线程需要共享对同一数据的存取。如果两个线程存取相同的对象,并且每一个线程都调用了一个修改该对象状态的方法,那么线程彼此踩了对方的脚,根据各线程访问数据的次序,可能会产生讹误的对象。这样的一种现象称之为竞争条件。当然多个线程共享一个变量在实际的应用中有时难以避免,但是我们可以通过java提供的一些技术来避免线程彼此踩脚的行为发生。java提供了转载 2017-04-12 10:08:08 · 1412 阅读 · 0 评论 -
ReentrantLock使用详解(2)之Condition
(1) ReentrantLock的条件对象通常,线程进入临界区,却发现在某一条件满足之后才能执行,条件对象就是用来管理那些已经获得了锁,但是却不能做有用工作的线程。一个锁对象可以有一个或多个相关的条件对象,我们可用lock.newCondition()方法获得一个条件对象。[java] view plain copy print?Reentrant转载 2017-04-12 10:15:52 · 527 阅读 · 0 评论 -
Java遍历HashMap并修改(remove)
遍历HashMap的方法有多种,比如通过获取map的keySet, entrySet, iterator之后,都可以实现遍历,然而如果在遍历过程中对map进行读取之外的操作则需要注意使用的遍历方式和操作方法。123456789101112131转载 2016-10-12 11:18:25 · 3354 阅读 · 0 评论 -
Java HashMap如何实现Key 的唯一性
大家都知道,在Map和Set不可存在重复元素? 但是对于内部的细节我们并不了解,今天我们就一块来 探讨一下!1 对于 HashMap HashSet 他们的底层数据结构的实现是:维护了一张 HashTable 。容器中的元素全部存储在Hashtable 中。他们再添加元素的时候,是如何判断是否存在有重复元素的呢? 每一个被添加的元素都有一个 hashCo转载 2016-10-12 09:21:52 · 10375 阅读 · 0 评论 -
Java线程之线程池
自JDK5之后,Java推出了一个并发包,java.util.concurrent,在Java开发中,我们接触到了好多池的技术,String类的对象池、Integer的共享池、连接数据库的连接池等等,池的最终目的都是节约资源,以更小的开销做更多的事情,从而提高性能。 我们的web项目都是部署在服务器上,浏览器端的每一个request就是一个线程,那么服务器需要并发的处理多个请转载 2016-06-07 15:14:54 · 373 阅读 · 0 评论 -
Java线程之线程中断/让步/睡眠/合并
线程中断 线程中断涉及到三个方法,如下:voidinterrupt() 中断线程。static booleaninterrupted() 测试当前线程是否已经中断。booleanisInterrupted() 测试线程是否已经中断。转载 2016-06-07 14:33:40 · 512 阅读 · 0 评论 -
Java线程之线程协作(生产者/消费者问题)
上一篇讲述了线程的互斥(同步),但是在很多情况下,仅仅同步是不够的,还需要线程与线程协作(通信),生产者/消费者问题是一个经典的线程同步以及通信的案例。该问题描述了两个共享固定大小缓冲区的线程,即所谓的“生产者”和“消费者”在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加转载 2016-06-07 12:46:51 · 415 阅读 · 0 评论 -
java异步计算-Future使用
1、异步计算实现过程 从jdk1.5开始我们可以利用Future来跟踪异步计算的结果。在此之前主线程要想获得工作线程(异步计算线程)的结果是比较麻烦的事情,需要我们进行特殊的程序结构设计,比较繁琐而且容易出错。有了Future我们就可以设计出比较优雅的异步计算程序结构模型:根据分而治之的思想,我们可以把异步计算的线程按照职责分为3类: 1. 异步计算的发起线程(控原创 2016-05-20 10:14:35 · 3328 阅读 · 0 评论 -
Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
在网上看到很多人对于CountDownLatch和CyclicBarrier的区别简单理解为CountDownLatch是一次性的,而CyclicBarrier在调用reset之后还可以继续使用。那如果只是这么简单的话,我觉得CyclicBarrier简单命名为ResetableCountDownLatch好了,显然不是的。我的理解是,要从他们的设计目的去看这两个类。javadoc里面的描述是原创 2016-05-09 16:57:28 · 1230 阅读 · 0 评论 -
公平锁与非公平锁
在Java的ReentrantLock构造函数中提供了两种锁:创建公平锁和非公平锁(默认)。代码如下:public ReentrantLock(){ sync = new NonfairSync();} public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new翻译 2016-05-09 16:45:08 · 1782 阅读 · 0 评论