自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

ignore

喷子太多,已离开 CSDN

  • 博客(19)
  • 问答 (1)
  • 收藏
  • 关注

原创 并发编程之学习总结

前言楼主自1月14号就停更了,这段时间一直在看JVM,因此没有更新任何文章,但楼主觉得有必要总结一下之前学习并发的过程,因为这一次的总结其实就是下一次的开始。主要时总结一下并发的学习路线,因为在楼主的工作环境中,并不是每天都在编写高并发的程序。然而,即使是这样,我们也要知道并发的每个知识点,这样才算一个合格的Java 程序员。那么如何系统的学习并发呢?学习路线是怎么样的呢?1. 学会开始就成功了一半

2018-01-27 22:26:25 1891

原创 并发编程之 ConcurrentLinkedQueue 源码剖析

前言今天我们继续分析 java 并发包的源码,今天的主角是谁呢?ConcurrentLinkedQueue,上次我们分析了并发下 ArrayList 的替代 CopyOnWriteArrayList,这次分析则是并发下 LinkedArrayList 的替代 ConcurrentLinkedQueue, 也就是并发链表。Demo该类继承结构如下:该类是 Collection 框架下的实现。也就是Ja

2018-01-14 00:26:32 484

原创 并发编程之 AQS 源码剖析

前言JDK 1.5 的 java.util.concurrent.locks 包中都是锁,其中有一个抽象类 AbstractQueuedSynchronizer (抽象队列同步器),也就是 AQS, 我们今天就来看看该类。1.结构我们看看该类的结构,该类被 CountDown,ThreadPoolExecutor,ReentrantLock,ReentrantReadWriteLock,Semap

2018-01-13 19:35:42 553 1

原创 并发编程之 Fork-Join 分而治之框架

前言“分而治之” 一直是一个有效的处理大量数据的方法。著名的 MapReduce 也是采取了分而治之的思想。简单来说,就是如果你要处理1000个数据,但是你并不具备处理1000个数据的能力,那么你可以只处理其中的10个,然后,分阶段处理100次,将100次的结果进行合成,那就是最终想要的对原始的1000个数据的处理结果。Fork & Join 的具体含义Fork 一词的原始含义是吃饭用的叉子,也有分

2018-01-11 00:24:24 512

原创 并发编程线程通信之管道流

前言在并发编程中,需要处理两个问题:线程之间如何通信及线程之间如何同步。通知是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。而子啊消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信。Java 的并发才作用的是共享内存模型,Java

2018-01-10 20:50:44 403

原创 并发编程之 CopyOnWriteArrayList 源码剖析

前言ArrayList 是一个不安全的容器,在多线程调用 add 方法的时候会出现 ArrayIndexOutOfBoundsException 异常,而 Vector 虽然安全,但由于其 add 方法和 get 方法都使用了 synchronized 关键字,导致在并发时的性能令人担忧,因此,伟大的 Doug Lea 编写了 CopyOnWriteArrayList 并发容器,用于替代并发时的 A

2018-01-10 20:12:05 818

原创 并发编程之 ThreadLocal 源码剖析

前言首先看看 JDK 文档的描述: 该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。 每个线程

2018-01-10 00:15:10 447 2

原创 并发编程之 LinkedBolckingQueue 源码剖析

前言JDK 1.5 之后,Doug Lea 大神为我们写了很多的工具,整个 concurrent 包基本都是他写的。也为我们程序员写好了很多工具,包括我们之前说的线程池,重入锁,线程协作工具,ConcurrentHashMap 等等,今天我们要讲的是和 ConcurrentHashMap 类似的数据结构,LinkedBolckingQueue,阻塞队列。在生产者消费者模型中,该类可以帮助我们快速的实

2018-01-08 23:51:16 518

原创 并发编程之 CAS 的原理

前言在并发编程中,锁是消耗性能的操作,同一时间只能有一个线程进入同步块修改变量的值,比如下面的代码synchronized void function(int b){ a = a + b;}如果不加 synchronized 的话,多线程修改 a 的值就会导致结果不正确,出现线程安全问题。但锁又是要给耗费性能的操作。不论是拿锁,解锁,还是等待锁,阻塞,都是非常耗费性能的。那么能不能不加锁呢?

2018-01-07 23:15:27 1106

原创 并发编程之 锁的优化有哪些

前言在 JDK 1.6 之前,synchronized 性能令人担忧,但是 1.6 之后,JVM 团队针对 synchronized 做了很多的优化,让 synchroized 在性能层面相比较 ReentrantLock 不相上下。那么,JVM 团队做了哪些优化呢?首先说,怎么才能优化?我们知道,“锁” 其实是互斥同步的具体实现,而互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需

2018-01-07 21:38:27 826

原创 并发编程之 ConcurrentHashMap(JDK 1.8) putVal 源码分析

前言我们之前分析了Hash的源码,主要是 put 方法。同时,我们知道,HashMap 在并发的时候是不安全的,为什么呢?因为当多个线程对 Map 进行扩容会导致链表成环。不单单是这个问题,当多个线程相同一个槽中插入数据,也是不安全的。而在这之后,我们学习了并发编程,而并发编程中有一个重要的东西,就是JDK 自带的并发容器,提供了线程安全的特性且比同步容器性能好出很多。一个典型的代表就是 Concu

2018-01-07 17:15:31 1155 2

原创 并发编程之 源码剖析 线程池 实现原理

前言在上一篇文章中我们介绍了线程池的使用,那么现在我们有个疑问:线程池到底是怎么实现的?毕竟好奇是人类的天性。那我们今天就来看看吧,扒开 他的源码,一探究竟。1. 从 Demo 入手上图是个最简单的demo,我们从这个 demo 开始看源码,首先一步一步来看。首先我们手动创建了线程池,使用了有数量限制的阻塞队列,使用了线程池工厂提供的默认线程工厂,和一个默认的拒绝策略,我们看看默认的线程工厂是如何创

2018-01-05 22:40:44 496

原创 并发编程之线程池的使用及扩展和优化

前言多线程的软件设计方法确实可以最大限度的发挥现代多核处理器的计算能力,提高生产系统的吞吐量和性能。但是,如果一个系统同时创建大量线程,线程间频繁的切换上下文导致的系统开销将会拖慢整个系统。严重的甚至导致内存耗尽导致OOM异常。因此,在实际的生产环境中,线程的数量必须得到控制,盲目的创建大量新车对系统是有伤害的。那么,怎么才能最大限度的利用CPU的性能,又能保持系统的稳定性呢?其中有一个方法就是使用

2018-01-04 22:32:29 1954

原创 并发编程之 线程协作工具 LockSupport

前言在前面的文章中,我们介绍了并发工具中的4个,Samephore,CyclicBarrier,CountDownLatch,Exchanger,但是我们漏了一个,非常的好用的工具,楼主在这里必须加上。LockSupportLockSupport 是一个非常方便实用的线程阻塞工具,他可以在任意位置让线程阻塞。并且是静态的方法。是不是很心动?LockSupport 的静态方法 park()可以阻塞当前

2018-01-04 00:35:23 367

原创 并发编程之 线程协作工具类

前言在并发编程的时候,Doug Lea 大师为我们准备了很多的工具,都在 JDK 1.5 版本后的java.util.concurrent 包下,今天楼主就和大家分享一些常用的线程协作的工具。Semaphore 信号量CountDownLatch 倒计时器CyclicBarrier 循环栅栏Exchanger 交换器1. Semaphore 信号量我们在上一篇文章中说到了3把锁,无论是 s

2018-01-03 23:25:21 423

原创 并发编程之 Java 三把锁

前言今天我们继续学习并发。在之前我们学习了 JMM 的知识,知道了在并发编程中,为了保证线程的安全性,需要保证线程的原子性,可见性,有序性。其中,synchronized 高频出现,因为他既保证了原子性,也保证了可见性和有序性。为什么,因为 synchronized 是锁。通过锁,可以让原本并行的任务变成串行。然而如你所见,这也导致了严重的性能受损。因此,不到万不得已,不要使用锁,特别是吞吐量要求特

2018-01-03 22:02:37 935

原创 并发编程之 Java 内存模型 + volatile 关键字 + Happen-Before 规则

前言楼主这个标题其实有一种作死的味道,为什么呢,这三个东西其实可以分开为三篇文章来写,但是,楼主认为这三个东西又都是高度相关的,应当在一个知识点中。在一次学习中去理解这些东西。才能更好的理解 Java 内存模型和 volatile 关键字还有 HB 原则。楼主今天就尝试着在一篇文章中讲述这三个问题,最后总结。讲并发知识前必须复习的硬件知识。Java 内存模型到底是什么玩意?Java 内存模型定

2018-01-03 00:50:11 1021

原创 并发编程之 Thread 类过期方法和常用方法

前言在 Java 刚诞生时,Thread 类就已经有了很多方法,但这些方法由于一些原因(有一些明显的bug或者设计不合理)有些已经废弃了,但是他们的方法名却是非常的好,真的是浪费。我们在进行并发必编程的时候一定要注意这些。过期方法1—– stop 方法过期方法2——suspend 方法和 resume 方法常用方法1——线程中断方法 interrupt,isInterrupted,static

2018-01-02 20:23:21 471

原创 并发编程之 wait notify 方法剖析

前言2018 元旦快乐。摘要:notify wait 如何使用?为什么必须在同步块中?使用 notify wait 实现一个简单的生产者消费者模型底层实现原理 1. notify wait 如何使用?今天我们要学习或者说分析的是 Object 类中的 wait notify 这两个方法,其实说是两个方法,这两个方法包括他们的重载方法一共有5个,而Object 类中一共才 12 个方法,可见

2018-01-01 22:49:38 546

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除