Java
文章平均质量分 94
Java
陌隋
这个作者很懒,什么都没留下…
展开
-
Arthas 使用的四种方式
简介:Arthas 是阿里巴巴开源的 Java 诊断工具。让我们能够在线排查项目发生的问题。除了知道它的存在之外,我们也需要知道我们如何去安装使用它,以便于提高我们日常开发解决 BUG 的效率。作者 | Montos(一个在后端道路上摸爬滚打的内卷人)来源|阿里巴巴云原生公众号Arthas 是阿里巴巴开源的 Java 诊断工具。让我们能够在线排查项目发生的问题。除了知道它的存在之外,我们也需要知道我们如何去安装使用它,以便于提高我们日常开发解决 BUG 的效率。方案介绍方案一..转载 2021-07-22 13:49:10 · 874 阅读 · 0 评论 -
Redis高级客户端Lettuce详解
前提Lettuce是一个Redis的Java驱动包,初识她的时候是使用RedisTemplate的时候遇到点问题Debug到底层的一些源码,发现spring-data-redis的驱动包在某个版本之后替换为Lettuce。Lettuce翻译为生菜,没错,就是吃的那种生菜,所以它的Logo长这样:既然能被Spring生态所认可,Lettuce想必有过人之处,于是笔者花时间阅读她的官方文档,整理测试示例,写下这篇文章。编写本文时所使用的版本为Lettuce 5.1.8.RELEASE,SpringB转载 2020-11-18 23:57:57 · 10187 阅读 · 0 评论 -
Java与Flex学习笔记(20)---将flex页面嵌入到jsp页面中
如果我们只需要用到Flex的一部分功能,例如播放器功能,我们可以单独把Flex页面嵌入到Jsp页面中。要想实现此功能,需要下载一个工程,将其覆盖在服务器根目录下即可。你可以在次下载:FlexModule_j2ee.zip。 在eclipse下新建一个web工程,将刚才下载的工程解压缩,然后将webtier文件夹下的内容覆盖服务器根目录下,如本人的:转载 2012-10-13 12:46:56 · 839 阅读 · 0 评论 -
Java与Flex学习笔记(18)----Flex中创建右键菜单
每次使用网盘如“115网盘”时都可以使用定制的右键菜单很是方便,都想在WEB中怎么实现这个右键菜单呢?到现在也没有摸清楚。不过,右键菜单在Flex中却可以很容易就实现了。 Flex中创建右键菜单现实内容的类是ContextMenuItem类。ContextMenuItem 类表示上下文菜单中的项。每个ContextMenuItem 对象都有一个显示在上下文菜单中的标题转载 2012-09-25 00:44:32 · 1043 阅读 · 0 评论 -
SLF4J和Logback和Log4j和Logging的区别与联系
前言 Java帝国在诞生之初就提供了集合、线程、IO、网络等常用功能,从C和C++领地那里吸引了大量程序员过来加盟,但是却有意无意地忽略了一个重要的功能: 输出日志。 对于这一点,IO大臣其实非常清楚, 日志是个很重要的东西, 因为程序运行起来以后, 基本上就是一个黑盒子,如果程序的行为和预料的不一致,那就是出现Bug了,如何去定位这个Bug 呢? 臣民们能用的工具有两个,第一个就是单步调试,一步步地跟踪,查看代码中变量的值, 这种办法费时费力, 并且只能在程...转载 2020-06-03 15:01:10 · 264 阅读 · 0 评论 -
JAVA泛型中的通配符 T,E,K,V,?
前言Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。泛型带来的好处在没有泛型的情况的下,通过对类型 Object 的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是本转载 2020-06-03 09:05:56 · 254 阅读 · 0 评论 -
哈希情史知多少
简介hash是我们工作中经常听到的词,比如哈希表、哈希函数、hashCode、HashTable、HashMap等等,那么它们之间到底有怎样的爱恨情仇呢?来一起看一看吧~~数组讲哈希表之前,我们先来看看数据结构的鼻祖——数组。数组比较简单,我就不多说了,大家都会都懂,见下图。数组的下标一般从0开始,依次往后存储元素,查找元素也是一样,只能从头(或从尾)依次查找元素。比如,要查找4这个元素,从头开始查找的话需要查找3次,从尾的话也需要2次。早期的哈希表上面讲了数组的缺点,查转载 2020-06-03 08:36:02 · 195 阅读 · 0 评论 -
深读源码-java线程系列之总结篇
简介线程系列我们基本就学完了,这一个系列我们基本都是围绕着线程池在讲,其实关于线程还有很多东西可以讲,后面有机会我们再补充进来。重要知识点直接上图,看着这张图我相信你能够回忆起很多东西,也可以看着这张图来自己提问自己回答,当然,也可以把这张图作为面试复习的参考。其中,ThreadLocal是我们没有分析的类,放在netty系列来学习,敬请期待^^彩蛋下一个系列我们将学习netty相关的知识,当然跑不掉的还有nio。我为什么直接讲netty了呢?因为netty很重要,很多框转载 2020-06-02 16:14:08 · 127 阅读 · 0 评论 -
深读源码-java线程系列之ForkJoinPool深入解析
简介随着在硬件上多核处理器的发展和广泛使用,并发编程成为程序员必须掌握的一门技术,在面试中也经常考查面试者并发相关的知识。今天,我们就来看一道面试题:如何充分利用多核CPU,计算很大数组中所有整数的和?剖析单线程相加?我们最容易想到就是单线程相加,一个for循环搞定。线程池相加?如果进一步优化,我们会自然而然地想到使用线程池来分段相加,最后再把每个段的结果相加。其它?Yes,就是我们今天的主角——ForkJoinPool,但是它要怎么实现呢?似乎没怎么用过哈^^三种实现转载 2020-06-01 19:50:35 · 433 阅读 · 0 评论 -
深读源码-java线程系列之线程池深入解析——定时任务执行流程
简介前面我们一起学习了普通任务、未来任务的执行流程,今天我们再来学习一种新的任务——定时任务。定时任务是我们经常会用到的一种任务,它表示在未来某个时刻执行,或者未来按照某种规则重复执行的任务。问题(1)如何保证任务是在未来某个时刻才被执行?(2)如何保证任务按照某种规则重复执行?来个栗子创建一个定时线程池,用它来跑四种不同的定时任务。public class ThreadPoolTest03 { public static void main(String[] ar转载 2020-06-01 16:11:09 · 113 阅读 · 0 评论 -
深读源码-java线程系列之线程池深入解析——未来任务执行流程
简介前面我们一起学习了线程池中普通任务的执行流程,但其实线程池中还有一种任务,叫作未来任务(future task),使用它您可以获取任务执行的结果,它是怎么实现的呢?建议学习本章前先去看看之前写的《深读源码-java线程系列之自己手写一个线程池进阶版》,有助于理解本章的内容,且那边的代码比较短小,学起来相对容易一些。问题(1)线程池中的未来任务是怎么执行的?(2)我们能学到哪些比较好的设计模式?(3)对我们未来学习别的框架有什么帮助?来个栗子我们还是从一个例子入手,来讲解来转载 2020-06-01 15:05:51 · 159 阅读 · 0 评论 -
深读源码-java线程系列之线程池深入解析——普通任务执行流程
简介前面我们一起学习了Java中线程池的体系结构、构造方法和生命周期,本章我们一起来学习线程池中普通任务到底是怎么执行的。建议学习本章前先去复习之前《深读源码-java线程系列之自己手写一个线程池》这两章内容,有助于理解本章的内容,且那边的代码比较短小,学起来相对容易一些。问题(1)线程池中的普通任务是怎么执行的?(2)任务又是在哪里被执行的?(3)线程池中有哪些主要的方法?(4)如何使用Debug模式一步一步调试线程池?使用案例我们创建一个线程池,它的核心数量为5,最大转载 2020-06-01 13:35:59 · 197 阅读 · 0 评论 -
阻塞线程不同方式的对比
引子大家知道,我最近在招人,今天遇到个同学,他的源码看过一些,然后我就开始了AQS连环问。我:说说AQS的大致流程?他:AQS包含一个状态变量,一个同步队列……balabala……互斥锁balabala,共享锁balabala……我:AQS中除了同步队列,还有什么队列?他:还有个Condition,Condition中有个条件队列……我:条件队列和同步队列有什么区别?他:条件队列balabala,然后调用LockSupport.park()进入休眠,等待被唤醒,……,balaba转载 2020-05-31 21:28:46 · 262 阅读 · 0 评论 -
深读源码-java线程系列之线程池深入解析——生命周期
简介上一章我们一起重温了下线程的生命周期(六种状态还记得不?),但是你知不知道其实线程池也是有生命周期的呢?!问题(1)线程池的状态有哪些?(2)各种状态下对于任务队列中的任务有何影响?先上源码其实,在我们讲线程池体系结构的时候,讲了一些方法,比如shutDown()/shutDownNow(),它们都是与线程池的生命周期相关联的。我们先来看一下线程池ThreadPoolExecutor中定义的生命周期中的状态及相关方法:private final AtomicIntege转载 2020-05-30 07:24:22 · 222 阅读 · 0 评论 -
深读源码-java线程系列之线程的生命周期
简介大家都知道线程是有生命周期,但是网上几乎没有一篇文章讲得是完全正确的。常见的错误有:就绪状态、运行中状态(RUNNING)、死亡状态、中断状态、只有阻塞没有等待状态、流程图乱画等,最常见的错误就是说线程只有5种状态。今天这篇文章会彻底讲清楚线程的生命周期,并分析synchronized锁、基于AQS的锁中线程状态变化的逻辑。所以,对synchronized锁和AQS原理(源码)不了解的同学,请翻一下博主之前的文章先熟悉这两部分的内容,否则肯定记不住这里讲的线程生命周期。问题(1)转载 2020-05-29 18:56:26 · 125 阅读 · 0 评论 -
深读源码-java线程系列之线程池深入解析——构造方法
简介ThreadPoolExecutor的构造方法是创建线程池的入口,虽然比较简单,但是信息量很大,由此也能引发一系列的问题,同样地,这也是面试中经常被问到的问题,下面只是列举了一部分关于ThreadPoolExecutor构造方法的问题,如果你都能回答上来,则可以不用看下面的分析了。问题(1)ThreadPoolExecutor有几个构造方法?(2)ThreadPoolExecutor最长的构造方法有几个参数?(3)keepAliveTime是做什么用的?(7)核心线程会不会超时关转载 2020-05-29 18:07:07 · 165 阅读 · 0 评论 -
深读源码-java线程系列之线程池深入解析——体系结构
简介Java的线程池是块硬骨头,对线程池的源码做深入研究不仅能提高对Java整个并发编程的理解,也能提高自己在面试中的表现,增加被录取的可能性。本系列将分成很多个章节,本章作为线程池的第一章将对整个线程池体系做一个总览。体系结构上图列举了线程池中非常重要的接口和类:(1)Executor,线程池顶级接口;(2)ExecutorService,线程池次级接口,对Executor做了一些扩展,增加一些功能;(3)ScheduledExecutorService,对Executor转载 2020-05-29 17:46:33 · 186 阅读 · 0 评论 -
深读源码-java线程系列之自己手写一个线程池进阶版
问题(1)自己动手写的线程池如何支持带返回值的任务呢?(2)如果任务执行的过程中抛出异常了该怎么处理呢?简介上一章我们自己动手写了一个线程池,但是它是不支持带返回值的任务的,那么,我们自己能否实现呢?必须可以,今天我们就一起来实现带返回值任务的线程池。前情回顾首先,让我们先回顾一下上一章写的线程池:(1)它包含四个要素:核心线程数、最大线程数、任务队列、拒绝策略;(2)它具有执行无返回值任务的能力;(3)它无法处理有返回值的任务;(4)它无法处理任务执行的异常(线程中转载 2020-05-29 16:33:30 · 165 阅读 · 0 评论 -
深读源码-java线程系列之自己手写一个线程池
问题(1)自己动手写一个线程池需要考虑哪些因素?(2)自己动手写的线程池如何测试?简介线程池是Java并发编程中经常使用到的技术,那么自己如何动手写一个线程池呢?本文将手把手带你写一个可用的线程池。属性分析线程池,顾名思义它首先是一个“池”,这个池里面放的是线程,线程是用来执行任务的。首先,线程池中的线程应该是有类别的,有的是核心线程,有的是非核心线程,所以我们需要两个变量标识核心线程数量coreSize和最大线程数量maxSize。为什么要区分是否为核心线程呢?这是为了控制转载 2020-05-28 22:41:58 · 200 阅读 · 0 评论 -
深读源码-java同步系列之总结篇
简介同步系列到此就结束了,本篇文章对同步系列做一个总结。脑图下面是关于同步系列的一份脑图,列举了主要的知识点和问题点,看过本系列文章的同学可以根据脑图自行回顾所学的内容,也可以作为面试前的准备。总结所谓同步,就是保证多线程(包括多进程)对共享资源的读写能够安全有效的运行。根据同步的运用场景的不同,实现同步的方式也是随之一起变化,但是总结下来,这些实现方式之间又有一些共通之处。不管是互斥锁、读写锁、信号量、CountDownLatch、回环栅栏、Phaser,还是各种分布式锁,转载 2020-05-27 18:35:59 · 126 阅读 · 0 评论 -
Curator实现分布式锁
简介分布式锁服务宕机, ZooKeeper 一般是以集群部署, 如果出现 ZooKeeper 宕机, 那么只要当前正常的服务器超过集群的半数, 依然可以正常提供服务持有锁资源服务器宕机, 假如一台服务器获取锁之后就宕机了, 那么就会导致其他服务器无法再获取该锁. 就会造成 死锁 问题, 在 Curator 中, 锁的信息都是保存在临时节点上, 如果持有锁资源的服务器宕机, 那么 ZooKeeper 就会移除它的信息, 这时其他服务器就能进行获取锁操作。zookeper的实现主要是下面四个类:I转载 2020-05-27 15:31:04 · 515 阅读 · 0 评论 -
Zookeeper的CAP原则
CAP原则简单介绍CAP 想要进行分布式事务控制,CAP理论是我们必须要知道的; CAP原则:也叫CAP定理,指的是在一个分布式系统中,一致性、可用性、分区容错性三者不可兼得 一致性(Consistency) 分布式系统中的所有主机在同一时刻是否可以保证具有完全相同的数据备份,若具有,则该分布式系统具有一致性 可用性(Availability) 在集群中,部分节点发生故障后,是否会影响对客户端读写请求的响应,注意,若在短时间内会影响,其也不具有这里说说转载 2020-05-26 22:45:35 · 16322 阅读 · 0 评论 -
深读源码-java同步系列之Phaser源码解析
问题(1)Phaser是什么?(2)Phaser具有哪些特性?(3)Phaser相对于CyclicBarrier和CountDownLatch的优势?简介Phaser,翻译为阶段,它适用于这样一种场景,一个大任务可以分为多个阶段完成,且每个阶段的任务可以多个线程并发执行,但是必须上一个阶段的任务都完成了才可以执行下一个阶段的任务。这种场景虽然使用CyclicBarrier或者CountryDownLatch也可以实现,但是要复杂的多。首先,具体需要多少个阶段是可能会变的,其次,每个阶转载 2020-05-26 21:48:18 · 262 阅读 · 0 评论 -
深读源码-java同步系列之CyclicBarrier源码解析
问题(1)CyclicBarrier是什么?(2)CyclicBarrier具有什么特性?(3)CyclicBarrier与CountDownLatch的对比?简介CyclicBarrier,回环栅栏,它会阻塞一组线程直到这些线程同时达到某个条件才继续执行。它与CountDownLatch很类似,但又不同,CountDownLatch需要调用countDown()方法触发事件,而CyclicBarrier不需要,它就像一个栅栏一样,当一组线程都到达了栅栏处才继续往下走。使用方法转载 2020-05-25 22:45:20 · 184 阅读 · 0 评论 -
深读源码-java同步系列之StampedLock源码解析
问题(1)StampedLock是什么?(2)StampedLock具有什么特性?(3)StampedLock是否支持可重入?(4)StampedLock与ReentrantReadWriteLock的对比?简介StampedLock是java8中新增的类,它是一个更加高效的读写锁的实现,而且它不是基于AQS来实现的,它的内部自成一片逻辑,让我们一起来学习吧。StampedLock具有三种模式:写模式、读模式、乐观读模式。ReentrantReadWriteLock中的读和写转载 2020-05-25 14:00:15 · 251 阅读 · 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 · 171 阅读 · 1 评论 -
深读源码-java同步系列之CountDownLatch源码解析
问题(1)CountDownLatch是什么?(2)CountDownLatch具有哪些特性?(3)CountDownLatch通常运用在什么场景中?(4)CountDownLatch的初始次数是否可以调整?简介CountDownLatch,可以翻译为倒计时器,但是似乎不太准确,它的含义是允许一个或多个线程等待其它线程的操作执行完毕后再执行后续的操作。CountDownLatch的通常用法和Thread.join()有点类似,等待其它线程都完成后再执行主任务。类结构C转载 2020-05-24 18:04:41 · 221 阅读 · 1 评论 -
深读源码-java同步系列之Semaphore源码解析
问题(1)Semaphore是什么?(2)Semaphore具有哪些特性?(3)Semaphore通常使用在什么场景中?(4)Semaphore的许可次数是否可以动态增减?(5)Semaphore如何实现限流?简介Semaphore,信号量,它保存了一系列的许可(permits),每次调用acquire()都将消耗一个许可,每次调用release()都将归还一个许可。特性Semaphore通常用于限制同一时间对共享资源的访问次数上,也就是常说的限流。下面我们一起来学习转载 2020-05-24 16:05:27 · 233 阅读 · 1 评论 -
深读源码-java同步系列之ReentrantReadWriteLock源码解析
问题(1)读写锁是什么?(2)读写锁具有哪些特性?(3)ReentrantReadWriteLock是怎么实现读写锁的?(4)如何使用ReentrantReadWriteLock实现高效安全的TreeMap?简介读写锁是一种特殊的锁,它把对共享资源的访问分为读访问和写访问,多个线程可以同时对共享资源进行读访问,但是同一时间只能有一个线程对共享资源进行写访问,使用读写锁可以极大地提高并发量。特性读写锁具有以下特性:是否互斥 读 写 读 否 是转载 2020-05-24 14:52:56 · 242 阅读 · 0 评论 -
深读源码-java同步系列之ReentrantLock与synchronized对比分析
问题(1)ReentrantLock有哪些优点?(2)ReentrantLock有哪些缺点?(3)ReentrantLock是否可以完全替代synchronized?简介synchronized是Java原生提供的用于在多线程环境中保证同步的关键字,底层是通过修改对象头中的MarkWord来实现的。ReentrantLock是Java语言层面提供的用于在多线程环境中保证同步的类,底层是通过原子更新状态变量state来实现的。既然有了synchronized的关键字来保证同步了,为转载 2020-05-24 11:22:20 · 253 阅读 · 0 评论 -
深读源码-java同步系列之ReentrantLock源码解析(二)——条件锁
问题(1)条件锁是什么?(2)条件锁适用于什么场景?(3)条件锁的await()是在其它线程signal()的时候唤醒的吗?简介条件锁,是指在获取锁之后发现当前业务场景自己无法处理,而需要等待某个条件的出现才可以继续处理时使用的一种锁。比如,在阻塞队列中,当队列中没有元素的时候是无法弹出一个元素的,这时候就需要阻塞在条件notEmpty上,等待其它线程往里面放入一个元素后,唤醒这个条件notEmpty,当前线程才可以继续去做“弹出一个元素”的行为。注意,这里的条件,必须是在获取锁转载 2020-05-23 23:25:35 · 232 阅读 · 0 评论 -
深读源码-java同步系列之ReentrantLock源码解析(一)——公平锁、非公平锁
问题(1)重入锁是什么?(2)ReentrantLock如何实现重入锁?(3)ReentrantLock为什么默认是非公平模式?(4)ReentrantLock除了可重入还有哪些特性?简介Reentrant = Re + entrant,Re是重复、又、再的意思,entrant是enter的名词或者形容词形式,翻译为进入者或者可进入的,所以Reentrant翻译为可重复进入的、可再次进入的,因此ReentrantLock翻译为重入锁或者再入锁。重入锁,是指一个线程获取锁之后再尝试转载 2020-05-23 22:09:27 · 227 阅读 · 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 · 164 阅读 · 0 评论 -
深读源码-java同步系列之自己手写一个锁Lock
问题(1)自己动手写一个锁需要哪些知识?(2)自己动手写一个锁到底有多简单?(3)自己能不能写出来一个完美的锁?简介本篇文章的目标一是自己动手写一个锁,这个锁的功能很简单,能进行正常的加锁、解锁操作。本篇文章的目标二是通过自己动手写一个锁,能更好地理解后面章节将要学习的AQS及各种同步器实现的原理。分析自己动手写一个锁需要准备些什么呢?首先,在上一章学习synchronized的时候我们说过它的实现原理是更改对象头中的MarkWord,标记为已加锁或未加锁。但是,我们转载 2020-05-23 18:53:52 · 248 阅读 · 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 · 214 阅读 · 0 评论 -
深读源码-java同步系列之volatile解析
问题(1)volatile是如何保证可见性的?(2)volatile是如何禁止重排序的?(3)volatile的实现原理?(4)volatile的缺陷?简介volatile可以说是Java虚拟机提供的最轻量级的同步机制了,但是它并不容易被正确地理解,以至于很多人不习惯使用它,遇到多线程问题一律使用synchronized或其它锁来解决。语义一:可见性前面介绍Java内存模型的时候,我们说过可见性是指当一个线程修改了共享变量的值,其它线程能立即感知到这种变化。关于Java内转载 2020-05-22 16:20:26 · 281 阅读 · 1 评论 -
深读源码-java同步系列之JMM(Java Memory Model)
简介Java内存模型是在硬件内存模型上的更高层的抽象,它屏蔽了各种硬件和操作系统访问的差异性,保证了Java程序在各种平台下对内存的访问都能达到一致的效果。硬件内存模型在正式讲解Java的内存模型之前,我们有必要先了解一下硬件层面的一些东西。在现代计算机的硬件体系中,CPU的运算速度是非常快的,远远高于它从存储介质读取数据的速度,这里的存储介质有很多,比如磁盘、光盘、网卡、内存等,这些存储介质有一个很明显的特点——距离CPU越近的存储介质往往越小越贵越快,距离CPU越远的存储介质往往越大越便转载 2020-05-22 11:15:14 · 244 阅读 · 0 评论 -
深读源码-java同步系列简介
简介同步系列,本来是准备写锁相关的内容,但是java中的CountDownLatch、Semaphore、CyclicBarrier这些类又不属于锁,它们和锁又有很多共同点,都是为了协同多线程的执行,都是一种同步器,所以这里就借用同步来取名字了,也就是“同步系列”的来源。概览这一篇的内容会比较多,大致包含三大主题:java中的锁、同步器、分布式锁,大致讲的内容如下:(1)volatile(2)synchronized(3)AQS及Condition(4)ReentrantLock转载 2020-05-21 22:47:46 · 105 阅读 · 0 评论 -
Leaf:美团的分布式唯一ID方案深入剖析
简介为什么叫leaf?因为天底下没有两片完全一样的树叶(德国哲学家、数学家莱布尼茨:There are no two identical leaves in the world),意味着每次通过leaf获取的ID肯定是唯一的。首先,简单介绍一下如何使用leaf。配置leaf是基于springboot、以HTTP协议的方式提供获取分布式唯一ID的服务。总计有两种模式:Snowflake和Segment。我们通过它的核心配置文件leaf.properties可知:leaf.name=afei转载 2020-05-21 21:15:43 · 1643 阅读 · 0 评论 -
深读源码-java并发包总结篇
概览原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换。原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割而只执行其中的一部分,将整个操作视作一个整体是原子性的核心特征。在java中提供了很多原子类,笔者在此主要把这些原子类分成四大类。原子更新基本类型或引用类型如果是基本类型,则替换其值,如果是引用,则替换其引用地址,这些类主要有:(1)AtomicBoolean原子更新布尔类型,内部使转载 2020-05-21 17:26:51 · 105 阅读 · 0 评论