随笔分类 - 并发编程
包含所有与并发编程相关的知识点
摘要:并发编程从零开始(十七)-ForkJoinPool(终章) 22 ForkJoinTask的fork/join 如果局部队列、全局中的任务全部是相互独立的,就很简单了。但问题是,对于分治算法来说,分解出来的一个个任务并不是独立的,而是相互依赖,一个任务的完成要依赖另一个前置任务的完成。 这种依赖关系
阅读全文
摘要:并发编程从零开始(十五)-CompletableFuture 14 CompletableFuture 用法 从JDK 8开始,在Concurrent包中提供了一个强大的异步编程工具CompletableFuture。在JDK8之前,异步编程可以通过线程池和Future来实现,但功能还不够强大。 C
阅读全文
摘要:并发编程从零开始(十四)-Executors工具类 12 Executors工具类 concurrent包提供了Executors工具类,利用它可以创建各种不同类型的线程池 12.1 四种对比 单线程的线程池: 固定数目线程的线程池: 每接收一个请求,就创建一个线程来执行: 单线程具有周期调度功能的
阅读全文
摘要:并发编程从零开始(十三)-线程池 第三部分:线程池与Future 9 线程池的实现原理 下图所示为线程池的实现原理:调用方不断地向线程池中提交任务;线程池中有一组线程,不断地从队列中取任务,这是一个典型的生产者—消费者模型。 要实现这样一个线程池,有几个问题需要考虑: 队列设置多长?如果是无界的,调
阅读全文
摘要:并发编程从零开始(十二)-Lock与Condition 8 Lock与Condition 8.1 互斥锁 8.1.1 锁的可重入性 “可重入锁”是指当一个线程调用 object.lock()获取到锁,进入临界区后,再次调用object.lock(),仍然可以获取到该锁。显然,通常的锁都要设计成可重入
阅读全文
摘要:并发编程从零开始(十一)-Atomic类 7 Atomic类 7.1 AtomicInteger和AtomicLong 如下面代码所示,对于一个整数的加减操作,要保证线程安全,需要加锁,也就是加synchronized关键字。 但有了Concurrent包的Atomic相关的类之后,synchron
阅读全文
摘要:并发编程从零开始(十)-同步工具类 6 同步工具类 6.1 Semaphore Semaphore也就是信号量,提供了资源数量的并发访问控制,其使用代码很简单,如下所示: 有参方法tryAcquire(long timeout, TimeUnit unit)的作用是在指定的时间内尝试地获取1个许可,
阅读全文
摘要:并发编程从零开始(九)-ConcurrentSkipListMap&Set CAS知识点补充: 我们都知道在使用 CAS 也就是使用 compareAndSet(current,next)方法进行无锁自加或者更换栈的表头之类的问题时会出现ABA问题。 Java中使用 AtomicStampedRef
阅读全文
摘要:并发编程从零开始(八)-ConcurrentHashMap 5.5 ConcurrentHashMap HashMap通常的实现方式是“数组+链表”,这种方式被称为“拉链法”。ConcurrentHashMap在这个基本原理之上进行了各种优化。 首先是所有数据都放在一个大的HashMap中;其次是引
阅读全文
摘要:并发编程从零开始(七)-ConcurrentLinkedQueue ####5.4 ConcurrentLinkedQueue/Deque AQS内部的阻塞队列实现原理:基于双向链表,通过对head/tail进行CAS操作,实现入队和出队。(队列中存放的是线程) ConcurrentLinkedQu
阅读全文
摘要:并发编程从零开始(六)-BlockingDeque+CopyOnWrite 5.2 BlockingDeque BlockingDeque定义了一个阻塞的双端队列接口: 该接口继承了BlockingQueue接口,同时增加了对应的双端队列操作接口。该接口只有一个实现,就是LinkedBlocking
阅读全文
摘要:并发编程从零开始(四) 4 JMM内存模型 4.1 JMM与happen-before 4.1.1 为什么会存在内存可见性问题 下图为x86架构下CPU缓存的布局,即在一个CPU 4核下,L1、L2、L3三级缓存与主内存的布局。每个核上面有L1、L2缓存,L3缓存为所有核共用。 因为存在CPU缓存一
阅读全文
摘要:并发编程从零开始(三) 3 并发的问题 3.1 数据竞争 如果有两个或者多个任务在临界段之外对一个共享变量进行写入操作,也就是说没有使用任何同步机制,那么应用程序可能存在数据竞争(也叫做竞争条件)。 在这些情况下,应用程序的最终结果可能取决于任务的执行顺序。 假设有两个不同的任务执行了同一个modi
阅读全文
摘要:并发编程从零开始(二) 2. 并发核心概念 2.1 并发与并行 在单个处理器上采用单核执行多个任务即为并发。在这种情况下,操作系统的任务调度程序会很快从一个任务切换到另一个任务,因此看起来所有的任务都是同时运行的。 同一时间内在不同计算机、处理器或处理器核心上同时运行多个任务,就是所谓的“并行”。
阅读全文
摘要:并发编程从零开始(一) 简介 java是一个支持多线程的开发语言。多线程可以在包含多个CPU核心的机器上同时处理多个不同的任务,优化资源的使用率,提升程序的效率。在一些对性能要求比较高场合,多线程是java程序调优的重要方面。 Java并发编程主要涉及以下几个部分: 并发编程三要素:原子性:即一个不
阅读全文