Java并发编程
Java高级必须掌握知识点,并发编程
陌隋
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
深读源码-java线程系列之线程模型
问题(1)线程类型有哪些?(2)线程模型有哪些?(3)各语言使用的是哪种线程模型?简介在Java中,我们平时所说的并发编程、多线程、共享资源等概念都是与线程相关的,这里所说的线程实际上应该叫作“用户线程”,而对应到操作系统,还有另外一种线程叫作“内核线程”。用户线程位于内核之上,它的管理无需内核支持;而内核线程由操作系统来直接支持与管理。几乎所有的现代操作系统,包括 Windows、Linux、Mac OS X 和 Solaris,都支持内核线程。最终,用户线程和内核线程之间必然转载 2020-05-27 19:11:18 · 234 阅读 · 0 评论 -
深读源码-java同步系列之总结篇
简介同步系列到此就结束了,本篇文章对同步系列做一个总结。脑图下面是关于同步系列的一份脑图,列举了主要的知识点和问题点,看过本系列文章的同学可以根据脑图自行回顾所学的内容,也可以作为面试前的准备。总结所谓同步,就是保证多线程(包括多进程)对共享资源的读写能够安全有效的运行。根据同步的运用场景的不同,实现同步的方式也是随之一起变化,但是总结下来,这些实现方式之间又有一些共通之处。不管是互斥锁、读写锁、信号量、CountDownLatch、回环栅栏、Phaser,还是各种分布式锁,转载 2020-05-27 18:35:59 · 197 阅读 · 0 评论 -
深读源码-java同步系列之redis分布式锁进化史
问题(1)redis如何实现分布式锁?(2)redis分布式锁有哪些优点?(3)redis分布式锁有哪些缺点?(4)redis实现分布式锁有没有现成的轮子可以使用?简介Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。本章我们将介绍如何基于redis实现分布式锁,并把其实现的进化史从头到尾讲明白,以便大家在面试的时候能讲清转载 2020-05-27 15:35:19 · 268 阅读 · 0 评论 -
深读源码-java同步系列之zookeeper分布式锁
问题(1)zookeeper如何实现分布式锁?(2)zookeeper分布式锁有哪些优点?(3)zookeeper分布式锁有哪些缺点?简介zooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它可以为分布式应用提供一致性服务,它是Hadoop和Hbase的重要组件,同时也可以作为配置中心、注册中心运用在微服务体系中。本章我们将介绍zookeeper如何实现分布式锁运用在分布式系统中。基础知识什么是znode?zooKeeper操作和维护的为一个个数据节点,称转载 2020-05-26 22:32:37 · 297 阅读 · 0 评论 -
深读源码-java同步系列之mysql分布式锁
问题(1)什么是分布式锁?(2)为什么需要分布式锁?(3)mysql如何实现分布式锁?(4)mysql分布式锁的优点和缺点?简介随着并发量的不断增加,单机的服务迟早要向多节点或者微服务进化,这时候原来单机模式下使用的synchronized或者ReentrantLock将不再适用,我们迫切地需要一种分布式环境下保证线程安全的解决方案,今天我们一起来学习一下mysql分布式锁如何实现分布式线程安全。基础知识mysql中提供了两个函数——get_lock('key', timeo转载 2020-05-26 22:01:39 · 211 阅读 · 0 评论 -
深读源码-java同步系列之Phaser源码解析
问题(1)Phaser是什么?(2)Phaser具有哪些特性?(3)Phaser相对于CyclicBarrier和CountDownLatch的优势?简介Phaser,翻译为阶段,它适用于这样一种场景,一个大任务可以分为多个阶段完成,且每个阶段的任务可以多个线程并发执行,但是必须上一个阶段的任务都完成了才可以执行下一个阶段的任务。这种场景虽然使用CyclicBarrier或者CountryDownLatch也可以实现,但是要复杂的多。首先,具体需要多少个阶段是可能会变的,其次,每个阶转载 2020-05-26 21:48:18 · 342 阅读 · 0 评论 -
深读源码-java同步系列之CyclicBarrier源码解析
问题(1)CyclicBarrier是什么?(2)CyclicBarrier具有什么特性?(3)CyclicBarrier与CountDownLatch的对比?简介CyclicBarrier,回环栅栏,它会阻塞一组线程直到这些线程同时达到某个条件才继续执行。它与CountDownLatch很类似,但又不同,CountDownLatch需要调用countDown()方法触发事件,而CyclicBarrier不需要,它就像一个栅栏一样,当一组线程都到达了栅栏处才继续往下走。使用方法转载 2020-05-25 22:45:20 · 278 阅读 · 0 评论 -
深读源码-java同步系列之StampedLock源码解析
问题(1)StampedLock是什么?(2)StampedLock具有什么特性?(3)StampedLock是否支持可重入?(4)StampedLock与ReentrantReadWriteLock的对比?简介StampedLock是java8中新增的类,它是一个更加高效的读写锁的实现,而且它不是基于AQS来实现的,它的内部自成一片逻辑,让我们一起来学习吧。StampedLock具有三种模式:写模式、读模式、乐观读模式。ReentrantReadWriteLock中的读和写转载 2020-05-25 14:00:15 · 324 阅读 · 0 评论 -
深读源码-java同步系列之AQS总结篇
问题(1)AQS的定位?(2)AQS的重要组成部分?(3)AQS运用的设计模式?(4)AQS的总体流程?简介AQS的全称是AbstractQueuedSynchronized,它的定位是为Java中几乎所有的锁和同步器提供一个基础框架。在之前的章节中,我们一起学习了ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch的源码,今天我们一起来对AQS做个总结。状态变量stateAQS中定义了一个状态变量st转载 2020-05-24 18:26:02 · 246 阅读 · 1 评论 -
深读源码-java同步系列之CountDownLatch源码解析
问题(1)CountDownLatch是什么?(2)CountDownLatch具有哪些特性?(3)CountDownLatch通常运用在什么场景中?(4)CountDownLatch的初始次数是否可以调整?简介CountDownLatch,可以翻译为倒计时器,但是似乎不太准确,它的含义是允许一个或多个线程等待其它线程的操作执行完毕后再执行后续的操作。CountDownLatch的通常用法和Thread.join()有点类似,等待其它线程都完成后再执行主任务。类结构C转载 2020-05-24 18:04:41 · 309 阅读 · 1 评论 -
深读源码-java同步系列之Semaphore源码解析
问题(1)Semaphore是什么?(2)Semaphore具有哪些特性?(3)Semaphore通常使用在什么场景中?(4)Semaphore的许可次数是否可以动态增减?(5)Semaphore如何实现限流?简介Semaphore,信号量,它保存了一系列的许可(permits),每次调用acquire()都将消耗一个许可,每次调用release()都将归还一个许可。特性Semaphore通常用于限制同一时间对共享资源的访问次数上,也就是常说的限流。下面我们一起来学习转载 2020-05-24 16:05:27 · 300 阅读 · 1 评论 -
深读源码-java同步系列之ReentrantReadWriteLock源码解析
问题(1)读写锁是什么?(2)读写锁具有哪些特性?(3)ReentrantReadWriteLock是怎么实现读写锁的?(4)如何使用ReentrantReadWriteLock实现高效安全的TreeMap?简介读写锁是一种特殊的锁,它把对共享资源的访问分为读访问和写访问,多个线程可以同时对共享资源进行读访问,但是同一时间只能有一个线程对共享资源进行写访问,使用读写锁可以极大地提高并发量。特性读写锁具有以下特性:是否互斥 读 写 读 否 是转载 2020-05-24 14:52:56 · 311 阅读 · 0 评论 -
深读源码-java同步系列之ReentrantLock与synchronized对比分析
问题(1)ReentrantLock有哪些优点?(2)ReentrantLock有哪些缺点?(3)ReentrantLock是否可以完全替代synchronized?简介synchronized是Java原生提供的用于在多线程环境中保证同步的关键字,底层是通过修改对象头中的MarkWord来实现的。ReentrantLock是Java语言层面提供的用于在多线程环境中保证同步的类,底层是通过原子更新状态变量state来实现的。既然有了synchronized的关键字来保证同步了,为转载 2020-05-24 11:22:20 · 350 阅读 · 0 评论 -
深读源码-java同步系列之ReentrantLock源码解析(二)——条件锁
问题(1)条件锁是什么?(2)条件锁适用于什么场景?(3)条件锁的await()是在其它线程signal()的时候唤醒的吗?简介条件锁,是指在获取锁之后发现当前业务场景自己无法处理,而需要等待某个条件的出现才可以继续处理时使用的一种锁。比如,在阻塞队列中,当队列中没有元素的时候是无法弹出一个元素的,这时候就需要阻塞在条件notEmpty上,等待其它线程往里面放入一个元素后,唤醒这个条件notEmpty,当前线程才可以继续去做“弹出一个元素”的行为。注意,这里的条件,必须是在获取锁转载 2020-05-23 23:25:35 · 331 阅读 · 0 评论 -
深读源码-java同步系列之ReentrantLock源码解析(一)——公平锁、非公平锁
问题(1)重入锁是什么?(2)ReentrantLock如何实现重入锁?(3)ReentrantLock为什么默认是非公平模式?(4)ReentrantLock除了可重入还有哪些特性?简介Reentrant = Re + entrant,Re是重复、又、再的意思,entrant是enter的名词或者形容词形式,翻译为进入者或者可进入的,所以Reentrant翻译为可重复进入的、可再次进入的,因此ReentrantLock翻译为重入锁或者再入锁。重入锁,是指一个线程获取锁之后再尝试转载 2020-05-23 22:09:27 · 335 阅读 · 0 评论 -
深读源码-java同步系列之AQS简介
问题(1)AQS是什么?(2)AQS的定位?(3)AQS的实现原理?(4)基于AQS实现自己的锁?简介AQS的全称是AbstractQueuedSynchronizer,它的定位是为Java中几乎所有的锁和同步器提供一个基础框架。AQS是基于FIFO的队列实现的,并且内部维护了一个状态变量state,通过原子更新这个状态变量state即可以实现加锁解锁操作。本章及后续章节的内容理解起来可能会比较晦涩,建议先阅读上一章的内容《深读源码-java同步系列之自己手写一个锁Lock》转载 2020-05-23 19:57:26 · 221 阅读 · 0 评论 -
深读源码-java同步系列之自己手写一个锁Lock
问题(1)自己动手写一个锁需要哪些知识?(2)自己动手写一个锁到底有多简单?(3)自己能不能写出来一个完美的锁?简介本篇文章的目标一是自己动手写一个锁,这个锁的功能很简单,能进行正常的加锁、解锁操作。本篇文章的目标二是通过自己动手写一个锁,能更好地理解后面章节将要学习的AQS及各种同步器实现的原理。分析自己动手写一个锁需要准备些什么呢?首先,在上一章学习synchronized的时候我们说过它的实现原理是更改对象头中的MarkWord,标记为已加锁或未加锁。但是,我们转载 2020-05-23 18:53:52 · 353 阅读 · 0 评论 -
深读源码-java同步系列之synchronized解析
问题(1)synchronized的特性?(2)synchronized的实现原理?(3)synchronized是否可重入?(4)synchronized是否是公平锁?(5)synchronized的优化?(6)synchronized的五种使用方式?简介synchronized关键字是Java里面最基本的同步手段,它经过编译之后,会在同步块的前后分别生成 monitorenter 和 monitorexit 字节码指令,这两个字节码指令都需要一个引用类型的参数来指明要锁定转载 2020-05-22 19:43:22 · 300 阅读 · 0 评论 -
深读源码-java同步系列之volatile解析
问题(1)volatile是如何保证可见性的?(2)volatile是如何禁止重排序的?(3)volatile的实现原理?(4)volatile的缺陷?简介volatile可以说是Java虚拟机提供的最轻量级的同步机制了,但是它并不容易被正确地理解,以至于很多人不习惯使用它,遇到多线程问题一律使用synchronized或其它锁来解决。语义一:可见性前面介绍Java内存模型的时候,我们说过可见性是指当一个线程修改了共享变量的值,其它线程能立即感知到这种变化。关于Java内转载 2020-05-22 16:20:26 · 374 阅读 · 1 评论 -
深读源码-java同步系列之JMM(Java Memory Model)
简介Java内存模型是在硬件内存模型上的更高层的抽象,它屏蔽了各种硬件和操作系统访问的差异性,保证了Java程序在各种平台下对内存的访问都能达到一致的效果。硬件内存模型在正式讲解Java的内存模型之前,我们有必要先了解一下硬件层面的一些东西。在现代计算机的硬件体系中,CPU的运算速度是非常快的,远远高于它从存储介质读取数据的速度,这里的存储介质有很多,比如磁盘、光盘、网卡、内存等,这些存储介质有一个很明显的特点——距离CPU越近的存储介质往往越小越贵越快,距离CPU越远的存储介质往往越大越便转载 2020-05-22 11:15:14 · 440 阅读 · 0 评论 -
深读源码-java同步系列简介
简介同步系列,本来是准备写锁相关的内容,但是java中的CountDownLatch、Semaphore、CyclicBarrier这些类又不属于锁,它们和锁又有很多共同点,都是为了协同多线程的执行,都是一种同步器,所以这里就借用同步来取名字了,也就是“同步系列”的来源。概览这一篇的内容会比较多,大致包含三大主题:java中的锁、同步器、分布式锁,大致讲的内容如下:(1)volatile(2)synchronized(3)AQS及Condition(4)ReentrantLock转载 2020-05-21 22:47:46 · 156 阅读 · 0 评论 -
深读源码-java并发包总结篇
概览原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换。原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割而只执行其中的一部分,将整个操作视作一个整体是原子性的核心特征。在java中提供了很多原子类,笔者在此主要把这些原子类分成四大类。原子更新基本类型或引用类型如果是基本类型,则替换其值,如果是引用,则替换其引用地址,这些类主要有:(1)AtomicBoolean原子更新布尔类型,内部使转载 2020-05-21 17:26:51 · 155 阅读 · 0 评论 -
深读源码-java并发包之LongAdder源码分析
问题(1)java8中为什么要新增LongAdder?(2)LongAdder的实现方式?(3)LongAdder与AtomicLong的对比?简介LongAdder是java8中新增的原子类,在多线程环境中,它比AtomicLong性能要高出不少,特别是写多的场景。它是怎么实现的呢?让我们一起来学习吧。原理LongAdder的原理是,在最初无竞争时,只更新base的值,当有多线程竞争时通过分段的思想,让不同的线程更新不同的段,最后把这些段相加就得到了完整的LongAdder转载 2020-05-21 15:48:09 · 290 阅读 · 0 评论 -
深读源码-java魔法类之Unsafe解析
问题(1)Unsafe是什么?(2)Unsafe只有CAS的功能吗?(3)Unsafe为什么是不安全的?(4)怎么使用Unsafe?简介本章是java并发包专题的第一章,但是第一篇写的却不是java并发包中类,而是java中的魔法类sun.misc.Unsafe。很多低级语言中可用的技巧在Java中都是不被允许的。Java是一个安全的开发工具,它阻止开发人员犯很多低级的错误,而大部份的错误都是基于内存管理方面的。我们知道JAVA作为高级语言的重要创新一点就是在于JVM的内存管转载 2020-05-20 15:21:24 · 646 阅读 · 0 评论 -
深读源码-java并发包之AtomicInteger源码分析
问题(1)什么是原子操作?(2)原子操作和数据库的ACID有啥关系?(3)AtomicInteger是怎么实现原子操作的?(4)AtomicInteger是有什么缺点?简介AtomicInteger是java并发包下面提供的原子类,主要操作的是int类型的整型,通过调用底层Unsafe的CAS等方法实现原子操作。还记得Unsafe吗?点击链接直达《深读源码-java魔法类之Unsafe解析》原子操作原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结转载 2020-05-21 09:47:20 · 333 阅读 · 0 评论 -
深读源码-java并发包之AtomicStampedReference源码分析
问题(1)什么是ABA?(2)ABA的危害?(3)ABA的解决方法?(4)AtomicStampedReference是什么?(5)AtomicStampedReference是怎么解决ABA的?简介AtomicStampedReference是java并发包下提供的一个原子类,它能解决其它原子类无法解决的ABA问题。ABAABA问题发生在多线程环境中,当某线程连续读取同一块内存地址两次,两次得到的值一样,它简单地认为“此内存地址的值并没有被修改过”,然而,同时可能存在另转载 2020-05-21 11:29:13 · 506 阅读 · 0 评论 -
深入理解CAS算法原理(进阶篇)
这一篇我们来深入介绍CAS的两个问题: Java当中CAS的底层实现 CAS的ABA问题和解决方法 首先看一看AtomicInteger当中常用的自增方法incrementAndGet:public final int incrementAndGet() { for (;;) { int current = get(); int next = current + 1; if (compare...转载 2020-05-10 15:50:26 · 741 阅读 · 0 评论 -
深入理解CAS算法原理
1、什么是CAS?CAS:Compare and Swap,即比较再交换。jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同步的,这是一种独占锁,也是是悲观锁。2、CAS算法理解对CAS的理解,CAS是一种无锁算法,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则转载 2020-05-10 11:31:20 · 402 阅读 · 0 评论
分享