并发系列整理
整理juc源码实现
bohu83
微信:bohu83
展开
-
阿里的在线评测题:多线程打印数据
我答的不好,那个伯乐在线评测系统不会用,本地写代码跑不成功挂了,总结下供后人参考。 题目:顺序递增打印正整数,从1开始打印到100,中间换行分隔。不允许重复打印出相同的数字,比如打印结果里出现2个5,3个6之类的。要求如下:1、使用三个线程A、B、C,其中线程A打印3的倍数,B打印5的倍数,C打印其他数字。这个题目还是比较考察多线程功力的,因为常规的加锁、或者使用join、co...原创 2019-10-30 23:35:45 · 4893 阅读 · 2 评论 -
java并发:线程池的分析和使用
本文属于java并发系列,转载原文是并发编程网的方腾飞大神所著,原文地址:http://ifeve.com/java-threadpool/原文如下:1. 引言合理利用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源...原创 2016-04-14 17:38:39 · 1217 阅读 · 0 评论 -
Java并发系列目录
主要是受《Java并发编程的艺术》一书读书笔记整理而成。本篇算是相关知识点的目录,第二章: Synchonized volatile 部分与第三章整合。 个人觉得顺序需要调整下,从第三章开始比较好。 另外,第二章偏重概念介绍synchronized,在找一篇结合看不懂的openjdk来讲究更好了。第 3章 内存模型相关: volatile 锁的内存语义(包含了happ...原创 2018-06-25 15:31:07 · 376 阅读 · 0 评论 -
thread的wait\notify实现线程通信
背景:之前的文章介绍过wait与sleep的区别,本文从另一个角度梳理一种实现线程通信的方式。正文: wait()、notify()和notifyAll()是Object类中的方法: 1)wait()、notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写。 2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有原创 2016-04-08 10:33:06 · 995 阅读 · 0 评论 -
java condition使用及分析
背景: 上一篇文章基于object的wait、notify实现了生产者、消费者模式。本篇文章继续梳理Condition。condition 介绍及demo Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition的await()、signal()...原创 2016-04-08 17:07:02 · 27322 阅读 · 6 评论 -
【转】Condition的await-signal流程详解
上一篇文章梳理了condtion,其中侧重流程,网上看到这篇文章文章介绍的很细。值得学习。特意转载过来。转载请注明出处:http://blog.youkuaiyun.com/luonanqin 上一篇讲了ReentrantLock的lock-unlock流程,今天这篇讲讲Condition的await-signal流程。Condition转载 2016-04-09 22:04:53 · 1000 阅读 · 0 评论 -
多线程系列:一介绍
本文是从结合并发编程网的学习笔记,主要是关注java的多线程及并发性。优点:资源利用率更好程序响应更快可以理解为更充分利用多核CPU的资源,去编写高性能的程序。缺点:设计更复杂:可以这样理解,要真确处理多线程直接数据同步的问题。上下文切换的开销:当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,原创 2016-04-09 22:35:35 · 952 阅读 · 0 评论 -
多线程系列:并发编程模型
本文属于并发编程网多线程学习系列。并发系统可以采用多种并发编程模型来实现。并发模型指定了系统中的线程如何通过协作来完成分配给它们的作业。并行工作者传入的作业会被分配到不同的工作者上。下图展示了并行工作者模型:在并行工作者模型中,委派者(Delegator)将传入的作业分配给不同的工作者。每个工作者完成整个任务。工作者们并行运作在不同的线程上,甚至可能在不同的CPU上转载 2016-04-10 09:14:51 · 899 阅读 · 0 评论 -
多线程系列:竞态临界区、共享资源
竞态临界区在同一程序中运行多个线程本身不会导致问题,问题只有在一或多个线程向这些资源做了写操作时才有可能发生,只要资源没有发生变化,多个线程读取相同的资源就是安全的。多线程同时执行下面的代码可能会出错:1public class Counter {2 protected long co转载 2016-04-10 20:00:23 · 1331 阅读 · 0 评论 -
多线程系列:线程安全及不可变性
当多个线程同时访问同一个资源,并且其中的一个或者多个线程对这个资源进行了写操作,才会产生竞态条件。多个线程同时读同一个资源不会产生竞态条件。我们可以通过创建不可变的共享对象来保证对象在线程间共享时不会被修改,从而实现线程安全。如下示例:01public class ImmutableValue{02转载 2016-04-10 21:20:28 · 860 阅读 · 0 评论 -
多线程系列:java同步块
Java同步关键字(synchronized)Java中的同步块用synchronized标记。同步块在Java中是同步在某个对象上。所有同步在一个对象上的同步块在同时只能被一个线程进入并执行操作。所有其他等待进入该同步块的线程将被阻塞,直到执行该同步块中的线程退出。有四种不同的同步块:实例方法 静态方法 实例方法中的同步块 静态方法中的同步块上述同步块都同步在不同对象上。实际需...转载 2016-04-11 10:45:20 · 1075 阅读 · 0 评论 -
多线程系列:线程通信
线程通信的目标是使线程间能够互相发送信号。另一方面,线程通信使线程能够等待其他线程的信号。例如,线程B可以等待线程A的一个信号,这个信号会通知线程B数据已经准备好了。本文将讲解以下几个JAVA线程间通信的主题:1、通过共享对象通信2、忙等待3、wait(),notify()和notifyAll()4、丢失的信号5、假唤醒6、多线程转载 2016-04-11 14:17:47 · 619 阅读 · 0 评论 -
java thread梳理
之前的文章介绍了java线程的背景由来,还有创建线程的方法。本篇把线程的常用方法梳理一下,作为补充。thread的常用方法里面,start方法与run方法之前介绍过。线程睡眠——sleep如果我们需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread的sleep方法,从上面可以看到sleep方法有两种重载的形式,但是使用方法一样。sle原创 2016-04-07 22:55:52 · 825 阅读 · 0 评论 -
java并发系列-Volatile
以下转发自大牛文章:http://flychao88.iteye.com/blog/1521235Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进原创 2016-04-11 18:23:06 · 596 阅读 · 0 评论 -
java并发编程学习-ExecutorService和CompletionService的区别
程老师原文地址:http://flychao88.iteye.com/blog/1522755我们现在在Java中使用多线程通常不会直接用Thread对象了,而是会用到java.util.concurrent包下的ExecutorService类来初始化一个线程池供我们使用。之前我一直习惯自己维护一个list保存submit的callable task所返回的Future对象。在主线程中遍历这个l原创 2016-04-11 18:23:08 · 640 阅读 · 0 评论 -
java并发学习:synchronized 的不足之处
程老师原文地址:http://flychao88.iteye.com/blog/1852893原文如下:1、不能够跨越多个对象。 2、当在等待锁对象的时候,不能中途放弃,直到成功。 3、等待没有超时限制。 4、不能中断阻塞。*******************************学习笔记***************************************原创 2016-04-11 18:23:16 · 2155 阅读 · 0 评论 -
java并发:AbstractQueuedSynchronizer的介绍和原理分析
本文属于java并发系列,原文地址:http://ifeve.com/introduce-abstractqueuedsynchronizer/并发编程网有原文,粗看一遍,很多地方不理解。今天在看juc锁的部分,底层还是依赖于aqs实现,特意在原文基础上梳理。原文如下:简介提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架。该同步器(以下简称同步器)利用了一...原创 2016-04-11 18:23:44 · 6705 阅读 · 0 评论 -
java学习-【转】SharedHashMap是更低延迟无GC暂停的Map实现
原文地址:http://flychao88.iteye.com/blog/2076419原文如下:SharedHashMap是开源工具OpenHFT一个子项目,SharedHashMap提供ConcurrentHashMap更低延迟无JVM的GC暂停的实现。两个特点是:1.所有元素都保存在Java heap之外,这样就不受GC影响,没有GC暂停。2.所有元素都在一个共享内存区域,对所有进程都是可视原创 2016-04-11 18:23:47 · 1494 阅读 · 0 评论 -
java学习-【转】如何用Java编写一段代码引发内存泄露
原文地址:http://flychao88.iteye.com/blog/2113133原文如下:本文来自StackOverflow问答网站的一个热门讨论:如何用Java编写一段会发生内存泄露的代码。 Q:刚才我参加了面试,面试官问我如何写出会发生内存泄露的Java代码。这个问题我一点思路都没有,好囧。A1:通过以下步骤可以很容易产生内存泄露(程序代码不能访问到某些对象,但是它们仍然保存在内存中)原创 2016-04-11 18:23:50 · 741 阅读 · 0 评论 -
java学习-【转】JAVA 线程池源码分析
原文地址:http://flychao88.iteye.com/blog/2125070原文内容如下:ava5之后为我们提供了线程池,只需要使用API,不用去考虑线程池里特殊的处理机制。Java5的线程池分好多种:固定尺寸的线程池、可变尺寸连接池等。常用的是ThreadPoolExecutor,它的继承关系如下: 下面详细说明一下自定义线程的使用:TreadPoolExecutor的常用构造方法如原创 2016-04-11 18:23:52 · 373 阅读 · 0 评论 -
并发学习-【转】深入理解并发之CompareAndSet(CAS)
程老师原文地址:http://flychao88.iteye.com/blog/2269438原文如下:一、CAS简介CAS:Compare and Swap, 翻译成比较并交换。java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁,使用这些类在多核CPU的机器上会有比较好的性能.CAS有3个操作数,内存值V,旧的预期...原创 2016-04-11 18:24:35 · 17496 阅读 · 2 评论 -
java梳理-【转】深入分析ConcurrentHashMap
方腾飞大神的聊聊并发系列写的太好了,本文属于其中之一,原文地址:http://ifeve.com/concurrenthashmap/ 原文如下:术语定义哈希算法(hash algorithm):是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值。 哈希表(hash table):根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址区间上,并以关键字在地原创 2016-04-11 18:25:29 · 1324 阅读 · 1 评论 -
Java线程总结(转)
作者的blog:(http://blog.matrix.org.cn/page/Kaizen) 首先要理解线程首先需要了解一些基本的东西,我们现在所使用的大多数操作系统都属于多任务,分时操作系统。正是由于这种操作系统的出现才有了多线程这个概念。我们使用的windows,linux就属于此列。什么是分时操作系统呢,通俗一点与就是可以同一时间执行多个程序的操作系统,在自己的电脑上面,你是不是一边听歌原创 2016-04-11 18:22:48 · 756 阅读 · 0 评论 -
多线程系列:TheadLocal(原理、内存泄漏、弱引用)
本文属于并发编程网多线程学习笔记系列。原文地址:http://ifeve.com/java-theadlocal/以下为原文:Java中的ThreadLocal类可以让你创建的变量只被同一个线程进行读和写操作。因此,尽管有两个线程同时执行一段相同的代码,而且这段代码又有一个指向同一个ThreadLocal变量的引用,但是这两个线程依然不能看到彼此的ThreadLocal变量域。常用方法...原创 2016-04-11 18:50:46 · 1571 阅读 · 0 评论 -
java多线程系列:死锁及检测
本文属于并发编程网多线程学习梳理系列。原文如下:死锁死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序请求同一组锁的时候。例如,如果线程1锁住了A,然后尝试对B进行加锁,同时线程2已经锁住了B,接着尝试对A进行加锁,这时死锁就发生了。线程1永远得不到B,线程2也永远得不到A,并且它们永远也不会知道发生了这样的事情。为了得转载 2016-04-12 17:00:45 · 8306 阅读 · 0 评论 -
java多线程系列:锁
本文属于并发编程网的多线程学习系列,原文如下:锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂。自Java 5开始,java.util.concurrent.locks包中包含了一些锁的实现,因此你不用去实现自己的锁了。但是你仍然需要去了解怎样使用这些锁,且了解这些实现背后的理论也是很有用处的。一个简单的锁:让我们从j转载 2016-04-12 21:07:56 · 625 阅读 · 0 评论 -
java并发系列:深入分析Synchronized
本文属于并发编程网聊聊并发的学习笔记系列,作者是方腾飞大神,本文在基本上忠于原文,为了便于像我这样的不懂这块的同学更好理解,在原文基础上适当调整。为尊重原著大神:特意贴出原文地址:http://ifeve.com/java-synchronized/1术语:CAS:Compare and Swap,比较并设置。用于在硬件层面上提供原子性操作。在 Intel 处理器中,比较并交换通过指令转载 2016-04-13 11:35:32 · 6108 阅读 · 8 评论 -
java并发系列:深入分析ReentrantLock
本文属于java并发梳理系列。引子锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。本文梳理下ReentrantLock。作为依赖于AbstractQueuedSynchronizer。 所以要理解ReentrantLock,先要理解AQS。关系图如下所示:aqs有多神奇,让Reentra原创 2016-04-13 18:13:12 · 1978 阅读 · 0 评论 -
基于优先级队列java线程池
背景最近在看同事的消息平台的问题进行优化,其中一点就是推送来的消息没有区分优先级,造成实时性要求高的不能优先满足,被全网下发的普通优先级占用了,造成消息延迟。对应的改进一点就是采用把现有线程池改为优先级队列。实现创建一个RunnablePriority,它实现Runnable接口和参数化为RunnablePriority类的Comparable接口。package thread原创 2016-04-26 14:23:59 · 8206 阅读 · 0 评论 -
流量控制与RateLimiter
一背景如何提高系统的稳定性,简单来说除了加机器外就是服务降级、限流。加机器就是常说的分布式,从整个架构的稳定性角度看,一般SOA每个接口的所能提供的单位时间服务能力是有上限。假如超过服务能力,一般会造成整个接口服务停顿,或者应用挂了,将延迟传递给服务调用方造成整个系统的服务能力丧失。要是对外的公开 API 接口服务,Rate limiting 应该是一个必备的功能,否极有可能被恶意调用导致服务原创 2016-06-06 17:46:15 · 14385 阅读 · 1 评论 -
《java并发编程的艺术》读书笔记-第四章java并发的基础
一概述 本文属于《java并发编程的艺术》读书笔记系列,第四章java并发的基础。4.1线程简介这里作者介绍了线程的相关知识,如线程、优先级,状态,daemon线程,线程的启动和停止。这里可以参照之前我整理的线程常见问题。4.2线程间通信4.2.1volatile跟synchronized关于这块理解就是先看下上一篇第三章介绍的java内存模型,这里面介绍了对应的内存含原创 2016-06-21 14:32:49 · 1249 阅读 · 0 评论 -
java并发系列:一线程常见问题
引子:本文属于面试题梳理系列,因为java的支持并发的特性,所以实际项目中会牵扯到对并发的开发、调优等。所以多线程相关知识经常被问到。这篇是第一篇,跟线程有关基础概念,通常面试官会从线程基础概念问起,但是只知道这些基础概念是不够的,最终会问到并发编程的诸多问题:如java内存模型,各种锁、死锁,各种j.u.c下面的工具、线程池、线程安全等等。可深入到底层实现的原理,其实梳理过程就是加深自己印象的过原创 2016-04-11 18:25:42 · 1657 阅读 · 1 评论 -
Redis分布式锁的简单实现分析
一 前言再看交易相关的代码时,发现了采用了Redislock,整理一下这块的知识点。二 业务现状:常见的分布式锁是为了解决不同进程需要互斥地访问共享资源。常见的业务场景有“秒杀”。对于账单来说,存在个订单多个账单的情况,而且不同的业务线字段不同,不能依靠数据库两个字段简单的唯一性索引约束。对性能要求高,允许偶发的失败。三 Redis实现分析首先是分布式锁几个关原创 2017-10-13 10:33:00 · 1598 阅读 · 0 评论 -
《开涛:网站架构核心技术》读书笔记系列-第15章【disruptor】
一 序:本章业务场景:队列在数据结构中是一种线性表,从一端插入数据,然后从另一端删除数据。作者举例的场景有:进行异步处理、系统解耦、数据同步、流量削峰、缓冲、限流等。前面的比较浅,总结起来,核心知识点有两块:1. disruptor+redis队列2. 基于canal实现数据异构。 下面说的就是整理其中的系统内部的内存式队列,非kafka那种分布式队列。******原创 2017-10-18 15:18:47 · 2151 阅读 · 0 评论 -
【多线程系列】future模式
一 序 传统的thread里面,在执行完任务之后无法获取执行结果。通过共享变量或者使用线程通信获取结果,比较麻烦。就是Runnable接口,线程的真正业务在run里面。jdk1.5 开始提供Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。二 future Callable 和Future位于java.util.concurrent 包下原创 2017-10-24 20:25:20 · 1487 阅读 · 0 评论 -
多线程系列汇总
一 并行设计模式: future master-worker二 线程池三 jdk并发数据结构 并发map 并发queue四 并发 控制方法: volatile同步:synchronized重入锁读写锁五 锁优化: 六 无锁设计: CAS原子操作、原创 2017-10-31 20:13:40 · 346 阅读 · 0 评论 -
Java集合:ConcurrentHashMap
序上一篇整理过hashmap. 插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同时在同一数组下用链表表示,造成闭环,导致在get时会出现死循环,所以HashMap是线程不安全的。而对应的安全的Hashtable是整个的加锁,所以...原创 2018-04-27 20:24:29 · 599 阅读 · 0 评论 -
Java集合:ConcurrentLinkedQueue
一 序在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环CAS的方式来实现.例如:ConcurrentLinkedQueue下面从源代码中分析ConcurrentLinkedQueu...原创 2018-06-19 20:21:36 · 432 阅读 · 0 评论 -
java并发系列:ReentrantReadWriteLock读写锁
一 序 之前整理过AQS(AbstractQueuedSynchronizer) 锁的基础。 还有重入锁(ReentrantLock),Java常见的多是排他锁,这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大...原创 2018-06-22 16:07:40 · 2731 阅读 · 2 评论 -
java并发系列:阻塞队列(1) ArrayBlockingQueue
一 阻塞队列 看了《Java并发编程的艺术》。继续整理。 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器...原创 2018-06-23 23:00:44 · 3365 阅读 · 0 评论