java并发编程
文章平均质量分 85
will的猜想
这个作者很懒,什么都没留下…
展开
-
使用RunTime.getRunTime().addShutdownHook优雅关闭线程池
RunTime.getRunTime().addShutdownHook转载 2022-11-21 09:57:16 · 502 阅读 · 0 评论 -
Java并发编程—阻塞队列源码分析
在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便。今天我们来讨论另外一类容器:阻塞队列。 在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了转载 2016-05-16 11:43:21 · 580 阅读 · 0 评论 -
AtomicInteger源码分析
AtomicInteger源码分析问题背景 最近在看LinkedBlockingQueue看到了其中的count使用AtomicInteger修饰,之前也看过AtomicInteger的一些解释,也是似懂非懂的,今天深入的了解了其实现方式,学到了很多东西。基础介绍 要对AtomicInteger有一个深入的认识,就必须要了解一下悲观锁和乐观锁。cpu是原创 2016-05-16 10:30:43 · 303 阅读 · 0 评论 -
Condition线程通信
那么引入本篇的主角,Condition,Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set (wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。下面将之原创 2016-05-14 16:24:14 · 309 阅读 · 0 评论 -
Java并发编程:volatile关键字解析
Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java转载 2016-05-14 14:08:10 · 318 阅读 · 1 评论 -
并发编程之ThreadLocal
ThreadLocal,直译为“线程本地”或“本地线程”,如果你真的这么认为,那就错了!其实,它就是一个容器,用于存放线程的局部变量,我认为应该叫做 ThreadLocalVariable(线程局部变量)才对,真不理解为什么当初 Sun 公司的工程师这样命名。早在 JDK 1.2 的时代,java.lang.ThreadLocal 就诞生了,它是为了解决多线程并发问题而设计的,只不过设计得原创 2016-05-11 13:52:33 · 349 阅读 · 0 评论 -
ConcurrentHashMap之源码分析
集合是编程中最常用的数据结构。而谈到并发,几乎总是离不开集合这类高级数据结构的支持。比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap)。这篇文章主要分析jdk1.5的3种并发集合类型(concurrent,copyonright,queue)中的ConcurrentHashMap,让我们从原理上细致的了解它们,能够让我们在深度项目开发中获益非浅转载 2016-05-14 15:45:48 · 242 阅读 · 0 评论 -
java线程池参数说明及队列拒绝策略
java.util.concurrent.ThreadPoolExecutor,其构造方法1: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime原创 2016-05-30 15:03:18 · 2391 阅读 · 0 评论 -
乐观锁与悲观锁
在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突。这就是著名的并发性问题。典型的冲突有:l 丢失更新:一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失。例如:用户A把值从6改为2,用户B把值从2改为6,则用户A丢失了他的更新。l 脏读:当一个事务读取其它完成一半事务的记录时,就会发生脏读取。例如:用户A,B看到的值都是6,用户B把值改为2,用原创 2016-08-07 12:47:51 · 336 阅读 · 0 评论 -
CAS 原理
一、锁机制常用的锁机制有两种:1、悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。悲观锁的实现,往往依靠底层提供的锁机制;悲观锁会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。 2、乐观锁:假设不会发生并发冲突,每次不加锁而是假设没有冲突而去完成某项操作,只在提交操作时检查是否违反数据完整性。如果因为冲突失败就重试,直到成功为止。乐观锁大多是基于数据版本记原创 2016-05-25 10:49:26 · 457 阅读 · 0 评论 -
ConcurrentHashMap关于方法的深度解析
还记得大学快毕业的时候要准备找工作了,然后就看各种面试相关的书籍,还记得很多面试书中都说到:HashMap是非线程安全的,HashTable是线程安全的。那个时候没怎么写Java代码,所以根本就没有听说过ConcurrentHashMap,只知道面试的时候就记住这句话就行了…至于为什么是线程安全的,内部怎么实现的,通通不了解。今天我们将深入剖析一个比HashTable性转载 2016-08-21 17:07:19 · 7215 阅读 · 2 评论 -
DelayQueue队列详解
概述DelayQueue是java.util.concurrent中提供的一个很有意思的类。本文将会对DelayQueue做一个介绍,然后列举应用场景。并且提供一个Delayed接口的实现和 Sample 代码。DelayQueue是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期...转载 2019-06-10 16:42:22 · 4745 阅读 · 0 评论 -
CopyOnWriteArrayList源码原理分析
Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。原创 2016-05-18 11:14:11 · 626 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier和Semaphore用法
CountDownLatch、CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法。 以下是本文目录大纲: 一.CountDownLatch用法 二.CyclicBarri转载 2016-05-18 16:06:14 · 465 阅读 · 0 评论 -
线程Lock
线程Lock 在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问。本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。 也许有朋友会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐述。本原创 2016-05-10 15:12:25 · 1225 阅读 · 0 评论 -
java中synchronize的总结
package cn.itcast.heima2;public class TraditionalThreadSynchronized {/*** @param args*/public static void main(String[] args) {new TraditionalThreadSynchronized().init();}private voi原创 2016-05-10 14:29:05 · 3236 阅读 · 0 评论 -
线程之join()
本章涉及到的内容包括:1. join()介绍2. join()源码分析(基于JDK1.7.0_40)3. join()示例thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。t.join(); //使调用线程 t 在此之前执行完毕。原创 2016-05-10 11:33:20 · 1756 阅读 · 1 评论 -
线程中sleep()方法和yield()方法
一. Thread.yield( )方法:使当前线程从执行状态(运行状态)变为可执行态(就绪状态)。cpu会从众多的可执行态里选择,也就是说,当前也就是刚刚的那个线程还是有可能会被再次执行到的,并不是说一定会执行其他线程而该线程在下一次中不会执行到了。Java线程中有一个Thread.yield( )方法,很多人翻译成线程让步。顾名思义,就是说当一个线程使用原创 2016-03-29 16:33:43 · 3739 阅读 · 1 评论 -
java线程中yield(),sleep(),wait()区别详解
1、sleep()使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据。注意该方法要捕捉异常。例如有两个线程同时执行(没有synchronized)一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优先级的原创 2016-03-28 20:12:21 · 322 阅读 · 0 评论 -
序列化下的单列模式解决
在解决单列模式序列化中提到一个问题,即 readResolve方法是干啥的? 当时也没多想, 只是列在那里, 今天忙里偷闲地把搜点材料整理下这个问题.原来这个方法跟对象的序列化相关(这样倒是解释了为什么 readResolve方法是private修饰的). ??? 怎么跟对象的序列化相关了?下面我们先简要地回顾下对象的序列化. 一般来说, 一个类实现了 Serializable接口原创 2016-08-24 16:30:31 · 411 阅读 · 0 评论 -
高并发下线程安全的单例模式
在所有的设计模式中,单例模式是我们在项目开发中最为常见的设计模式之一,而单例模式有很多种实现方式,你是否都了解呢?高并发下如何保证单例模式的线程安全性呢?如何保证序列化后的单例对象在反序列化后任然是单例的呢?这些问题在看了本文之后都会一一的告诉你答案,赶快来阅读吧!什么是单例模式?在文章开始之前我们还是有必要介绍一下什么是单例模式。单例模式是为确保一个类只有一个实例,并为整个系统提供一转载 2016-08-24 16:19:32 · 595 阅读 · 0 评论 -
ReentrantLock(可重入锁)
简介ReentrantLock的实现不仅可以替代隐式的synchronized关键字,而且能够提供超过关键字本身的多种功能。这里提到一个锁获取的公平性问题,如果在绝对时间上,先对锁进行获取的请求一定被先满足,那么这个锁是公平的,反之,是不公平的,也就是说等待时间最长的线程最有机会获取锁,也可以说锁的获取是有序的。ReentrantLock这个锁提供了一个构造函数,能够控制这个锁转载 2016-07-12 15:30:42 · 498 阅读 · 0 评论 -
Java并发编程与技术内幕:ArrayBlockingQueue、LinkedBlockingQueue及SynchronousQueue源码解析
一、BlockingQueue介绍与常用方法BlockingQueue是一个阻塞队列。在高并发场景是用得非常多的,在线程池中。如果运行线程数目大于核心线程数目时,也会尝试把新加入的线程放到一个BlockingQueue中去。队列的特性就是先进先出很容易理解,在java里头它的实现类主要有下图的几种,其中最常用到的是ArrayBlockingQueue、LinkedBlockingQueue转载 2016-07-08 11:41:11 · 779 阅读 · 0 评论 -
深入JVM锁机制-synchronized
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea。本文并不比较synchronized与Lock孰优孰劣,只是介绍二者的实现原理。 数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CPU指令转载 2016-07-08 14:53:22 · 756 阅读 · 0 评论 -
java内存模型
为什么学习Java的内存模式缓存一致性问题什么是内存模型JMM(Java Memory Model)简介volatitle关键字原子性可见性有序性指令重排先行发生——happen-before原则解释执行和编译执行其他语言(c和c++)也有内存模型么? 为什么需要关注Java内存模型? 之前有一个我实习的同事(已经工作的)反讽我:学(关注)这个有什么用?原创 2016-08-10 15:55:15 · 657 阅读 · 0 评论 -
Callable 和Future
在Java5之前,线程是没有返回值的,常常为了“有”返回值,破费周折,而且代码很不好写。或者干脆绕过这道坎,走别的路了。现在Java终于有可返回值的任务(也可以叫做线程)了。 可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口。执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable原创 2016-05-10 15:53:48 · 353 阅读 · 0 评论