并发
JustinNeil
年少是你未醒的梦话,风华是燃尽的彼岸花
展开
-
AQS
AQS简介AQS原理分析AQS原理概览AQS对资源的共享方式AQS低层使用了模板方法模式AQS组件总结简介AQS的全称为(AbstractQueuedSynchronizer),这个类在java.util.concurrent.locks包下面。AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如ReentrantLock,Semaphore,其...原创 2019-08-02 15:25:47 · 278 阅读 · 0 评论 -
fail-fast究竟是个什么鬼?
fail-fast概念引入实例分析集合类中的fail-fast异常分析异常原理总结概念引入首先我们看下维基百科中关于fail-fast的解释: 在系统设计中,快速失效系统一种可以立即报告任何可能表明故障的情况的系统。快速失效系统通常设计用于停止正常操作,而不是试图继续可能存在缺陷的过程。这种设计通常会在操作中的多个点检查系统的状态,因此可以及早检测到任何故障。快速失败模块的职责是检测错误...原创 2019-08-13 20:36:47 · 1470 阅读 · 0 评论 -
公平锁与非公平锁
公平锁与非公平锁什么是公平锁概念优点缺点图示什么是非公平锁概念优点缺点图示源码分析公平锁非公平锁总结什么是公平锁概念公平锁是指多个线程按照申请锁的顺序来获得锁,线程直接进入队列中排队,队列中的第一个线程才能获得锁。优点等待锁的线程不会饿死。缺点整体吞吐效率比非公平锁要低,等待队列中除第一个以外的线程都会阻塞,CPU唤醒阻塞线程的开销比非公平锁要大。图示什么是非公平锁概念非公...原创 2019-08-09 13:59:57 · 881 阅读 · 1 评论 -
可重入锁与非可重入锁
可重入锁与非可重入锁可重入锁又称递归锁,是指同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提是锁对象得是同一个对象),不会因为之前已经获取过锁还没有释放而阻塞。Java中的ReentrantLock和synchronized都是可重入锁,可重入锁的一个优点就是可以避免死锁,下面结合源码分析public class Wedget{ public synchroniz...原创 2019-08-09 19:06:09 · 3374 阅读 · 6 评论 -
独占锁与共享锁
独占锁与共享锁前言概念引入独占锁概念共享锁概念源码分析ReentrantReadWriteLock源码读锁和写锁的具体加锁方式有什么区别前言独占锁和共享锁同样是一种概念。我们先介绍一下具体的概念,然后通过ReentrantLock和ReentrantReadWriteLock的源码来介绍独占锁和共享锁。概念引入独占锁概念独占锁也叫排他锁,是指该锁一次只能被一个线程所持有。如果线程T对数据...原创 2019-08-09 19:38:11 · 13074 阅读 · 0 评论 -
并发编程
并发编程前言为什么要用并发并发编程有哪些缺点频繁的上下文切换相关概念线程安全问题前言 一直以来并发编程对于刚入行的小白来说总是觉得高深莫测,于是乎,就诞生了想写点东西记录下,以提升理解和对并发编程的认知。为什么要用并发?凡事总有好坏两面,并发编程具有哪些缺点?以及在进行并发编程时应该了解和掌握的概念是什么?这篇文章主要就这三个问题来谈一谈。为什么要用并发 一直以来,硬件的发展极其迅速,...原创 2019-08-10 10:48:50 · 140 阅读 · 0 评论 -
Executor
Executor简介分类简介 Executor 管理多个异步任务的执行,而无需程序员显式地管理线程的生命周期。这里的异步是指多个任务的执行互不干扰,不需要进行同步操作。分类主要有三种 Executor:CachedThreadPool:一个任务创建一个线程;FixedThreadPool:所有任务只能使用固定大小的线程;SingleThreadExecutor:相当于大小为 1 ...原创 2019-08-16 15:53:24 · 311 阅读 · 0 评论 -
CyclicBarrier
CyclicBarrier 用来控制多个线程互相等待,只有当多个线程都到达时,这些线程才会继续执行。 和 CountdownLatch 相似,都是通过维护计数器来实现的。线程执行 await() 方法之后计数器会减 1,并进行等待,直到计数器为 0,所有调用 await() 方法而在等待的线程才能继续执行。 CyclicBarrier 和 CountdownLatch 的一个区别是,C...原创 2019-08-16 15:55:39 · 89 阅读 · 0 评论 -
CountDownLatch
CountDownLatch用来控制一个或者多个线程等待多个线程。维护了一个计数器 cnt,每次调用 countDown() 方法会让计数器的值减 1,减到 0 的时候,那些因为调用 await() 方法而在等待的线程就会被唤醒。public class CountdownLatchExample { public static void main(String[] args) t...原创 2019-08-16 15:56:41 · 98 阅读 · 0 评论 -
如何设计一个高并发系统
如何设计一个高并发系统面试官心理分析面试题剖析系统拆分缓存MQ分库分表读写分离ElasticSearch总结面试官心理分析 如果你确实有真才实学,在互联网公司里干过高并发系统,那你确实拿 offer 基本如探囊取物,没啥问题。面试官也绝对不会这样来问你,否则他就是蠢。 假设你在某知名电商公司干过高并发系统,用户上亿,一天流量几十亿,高峰期并发量上万,甚至是十万。那么人家一定会仔细盘问你的...原创 2019-08-17 20:50:38 · 892 阅读 · 1 评论 -
锁的四种状态
锁的四种状态概念引入Java对象头Monitor概念引入无锁、偏向锁、轻量级锁和重量级锁,这四种锁是指锁的状态,专门针对synchronized的。在介绍这四种锁状态前,还需要介绍一些额外的知识。首先为什么synchronized能实现线程同步?在回答这个问题之前我们要先了解两个概念:Java对象头、Monitor。Java对象头synchronized是悲观锁,在操作同步资源之前要给...原创 2019-08-09 09:46:29 · 3408 阅读 · 2 评论 -
自旋锁与适应性自旋锁
自旋锁与适应性自旋锁概念引入自旋锁与非自旋锁流程图自旋锁的缺陷自旋锁的实现原理自适应自旋锁概念引入在介绍自旋锁之前,我们需要介绍一些前提知识来帮助大家理解自旋锁的概念。阻塞或唤醒一个Java进程,需要操作系统切换CPU状态来完成,这种状态转换需要耗费处理器时间。如果同步代码块中的内容过于简单,状态转换花费的时间有可能比用户代码执行的时间还长。在许多场景中,同步资源的锁定时间很短,为了这一小...原创 2019-08-09 08:52:35 · 2440 阅读 · 2 评论 -
JDK并发容器总结
JDK并发容器总结概述ConcurrentHashMap实现原理ConcurrentHashMap 和 HashTable 的区别CopyOnWriteArrayList简介实现方式源码分析读取操作写入操作ConcurrentLinkedQueueBlockingQueueArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueueConcu...原创 2019-08-02 16:33:43 · 202 阅读 · 0 评论 -
悲观锁与乐观锁
悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java里面的同步原语synchronized关键字和ReentrantLock的实现也是悲观锁。 乐观锁:就是每次去拿数据的时候都认为别人不会修改,所以不...原创 2019-05-21 08:38:22 · 135 阅读 · 0 评论 -
Synchronized和ReenTrantLock的对比
Synchronized和ReenTrantLock对比两者都是可重入锁synchronized 依赖于 JVM 而 ReenTrantLock 依赖于 APIReenTrantLock 比 synchronized 增加了一些高级功能性能已不是选择标准两者都是可重入锁两者都是可重入锁。“可重入锁”概念是:自己可以再次获取自己的内部锁。比如一个线程获得了某个对象的锁,此时这个对象锁还没有释放,...原创 2019-08-02 10:02:10 · 287 阅读 · 0 评论 -
锁优化
锁优化概述偏向锁轻量级锁自旋锁和自适应自旋锁消除锁粗化概述JDK1.6 对锁的实现引入了大量的优化,如偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除、锁粗化等技术来减少锁操作的开销。锁主要存在四中状态,依次是:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态,他们会随着竞争的激烈而逐渐升级。注意锁可以升级不可降级,这种策略是为了提高获得锁和释放锁的效率。偏向锁引入偏向锁的目的和引入轻量级...原创 2019-08-02 09:41:57 · 125 阅读 · 0 评论 -
同步代码块和同步方法的区别
同步方法块和同步方法的区别只需要对临界区的代码进行同步在同步代码块中,我们可以自由选择锁JVM层面的不同这个问题,可以理解为在实际开发中,是使用同步代码块好,还是使用同步方法好?答:同步代码块比同步方法好只需要对临界区的代码进行同步我们要清楚实际要同步的临界区,大多数情况下,只是某一段需要同步当然如果整个方法都需要同步,同步代码块和同步方法其实效果是一样的在同步代码块中,我们可以自由选...原创 2019-08-01 19:59:38 · 1126 阅读 · 0 评论 -
volatile关键字
volatile关键字volatile关键字的作用synchronized关键字和volatile关键字比较volatile关键字的作用在 JDK1.2 之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的。而在当前的 Java 内存模型下,线程可以把变量保存本地内存比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的...原创 2019-08-02 10:18:49 · 100 阅读 · 0 评论 -
ThreadLocal
ThreadLocalThreadLocal简介ThreadLocal示例ThreadLocal原理ThreadLocal内存泄露问题ThreadLocal简介通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢? JDK中提供的ThreadLocal类正是为了解决这样的问题。 ThreadLocal类主要解决的就是让每个线程绑定自...原创 2019-08-02 10:59:23 · 120 阅读 · 0 评论 -
线程池
线程池为什么要用线程池?实现Runnable接口和Callable接口的区别执行execute()方法和submit()方法的区别是什么呢?如何创建线程池为什么要用线程池?线程池提供了一种限制和管理资源(包括执行一个任务)。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。这里借用《Java并发编程的艺术》提到的来说一下使用线程池的好处:降低资源消耗。 通过重复利用已创建的线程降低...原创 2019-08-02 13:54:11 · 120 阅读 · 0 评论 -
Atomic原子类
Atomic原子类简介JUC包下的原子类分类基本类型数组类型引用类型对象的属性修改类型原子类总结基本类型原子类数组类型原子类引用类型原子类对象的属性修改类型原子类简介Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程...原创 2019-08-02 14:32:35 · 191 阅读 · 0 评论 -
五种常用线程池的特征和作用
五种常用线程池的特征和作用newCachedThreadPoolnewFixedThreadPoolnewSingleThreadExecutornewScheduledThreadnewSingleScheduledThreadnewCachedThreadPool作用:创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们,并在需要时使用提供的 ThreadFactor...原创 2019-09-06 10:45:28 · 424 阅读 · 0 评论