自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 资源 (2)
  • 收藏
  • 关注

原创 2022年最新最全1100+JAVA服务端面试题

2022年最新最全1100+JAVA服务端面试题,涵盖JAVA、数据库、REDIS等17大类、77个小类。

2022-10-17 19:42:48 288 1

原创 开源一套高并发多方案秒杀架构源码

源码地址:https://github.com/ThoughtsBeta/flash-sale高并发多方案秒杀架构本源码原是小册的配套源码,旨在帮助小册读者从源码解构高并发设计的核心要义,现已开源。源码包含两个部分:核心应用和网关应用。受限于版权要求,如需详尽的源码解读,请参阅小册《高并发秒杀设计精要与实现》。源码核心特性基于Spring Boot和Spring Cloud的完整分布式架构应用实践;本地缓存与分布式缓存的设计技巧;同步下单和高并发库存扣减方式;异步队列下单和库存扣减;去中心

2021-12-10 11:02:14 454

原创 起底JVM内存管理及性能调优【80+页Keynote私享PDF】

本文出自二爷箱底下的一份陈年文稿,近日整理资料时被倒腾出来。从内容上看,内容都还没有太过时,于是稍作调整后分享给大家。不过,限于二爷的水平,文稿难免存在错误,欢迎评论区批评指正。由于图片较多(86张),可能引起部分同学不适,你可以直接划拉到本文底部,有PDF版本的获取提示,可以直接获取PDF版本阅读、收藏。PDF版本获取方式关注公众号

2021-07-09 14:59:15 233 1

原创 美丽代码的秘密-《重构》如何让你的代码和你一样赏心悦目【PDF】

在CSDN,同学们往往喜欢分享技术原理性或教程类的文章,这是程序员的天性使然。然而,在我们科学性的技术范畴之外,软件工程则是另外一个重要的话题。通俗地讲,计算机科学是让我们如何把事情做对,即不能出错;而软件工程则教会我们如何做对的事情,也就是做得更好。这篇文章所要介绍的 《重构》 正是属于软件工程的话题,没有它不会耽误你编程,但拥有之后你可能会写出更好的代码。《重构》由ThoughtWorks的首席科学家、软件架构领域的前辈Martin Fowler编写,著作经典且口碑极好。有人说,重构是程序员的洗髓经,

2021-07-09 14:56:19 532

原创 铂金05:致胜良器-无处不在的“阻塞队列”究竟是何面目

欢迎来到《并发王者课》,本文是该系列文章中的第18篇。在线程的同步中,阻塞队列是一个绕不过去的话题,它是同步器底层的关键。所以,我们在本文中将为你介绍阻塞队列的基本原理,以了解它的工作机制和它在Java中的实现。本文稍微有点长,建议先了解大纲再细看章节。一、阻塞队列介绍在生活中,相信你一定见过下图的人山人海,也见过其中的秩序井然。混乱,是失控的开始。想想看,在没有秩序的情况下,拥挤的人流蜂拥而上十分危险,轻则挤出一身臭汗,重则造成踩踏事故。而秩序,则让情况免于混乱,排好队大家都舒服。面对人流,我们

2021-06-26 17:37:33 137

原创 铂金04:令行禁止-为何说信号量是线程间的同步利器

欢迎来到《并发王者课》,本文是该系列文章中的第17篇。在并发编程中,信号量是线程同步的重要工具。在本文中,我将带你认识信号量的概念、用法、种类以及Java中的信号量。信号量(Semaphore) 是线程间的同步结构,主要用于多线程协作时的信号传递,以及对共享资源的保护、防止竞态的发生等。信号量这一概念听起来比较抽象,然而读完本文你会发现它竟然也是如此通俗易懂且挺有用。一、认识简单的信号量虽然信号量的概念很抽象,但理解起来可以很简单。比如下面这幅图,在峡谷对局中,大乔使用大招向哪吒发起了救援,而哪吒在

2021-06-25 19:29:40 195 1

原创 铂金03:一劳永逸-如何理解锁的可重入问题

欢迎来到《并发王者课》,本文是该系列文章中的第16篇。在前面的文章《铂金1:探本溯源-为何说Lock接口是Java中锁的基础》中,我们提到了锁的可重入问题,并作了简单介绍。鉴于锁的可重入是一个重要概念,所以本文把拿出来做一次单独讲解,以帮助你彻底理解它。一、锁的可重入所造成的问题首先,我们通过一段示例代码看锁的可重入是如何导致问题发生,以理解它的重要性。public class ReentrantWildArea { // 野区锁定 private boolean isAreaLoc

2021-06-25 19:29:02 177 1

原创 铂金02:豁然开朗-“晦涩难懂”的ReadWriteLock竟如此妙不可言

欢迎来到《并发王者课》,本文是该系列文章中的第15篇。在上篇文章中,我们介绍了Java中锁的基础Lock接口。在本文中,我们将介绍Java中锁的另外一个重要的基本型接口,即ReadWriteLock接口。在探索Java中的并发时,ReadWriteLock无疑是重要的,然而理解它却并不容易。如果你此前曾经检索资料,应该会发现大部分的文章对它的描述都比较晦涩难懂,或连篇累牍的源码陈列,或隔靴搔痒的三言两语,既说不到重点,也说不清来龙去脉。所以,在本文中我们会将介绍的重点放在对思路的理解上,而不是对源码的

2021-06-25 19:28:22 171 1

原创 铂金1:探本溯源-为何说Lock接口是Java中锁的基础

欢迎来到《并发王者课》,本文是该系列文章中的第14篇。在黄金系列中,我们介绍了并发中一些问题,比如死锁、活锁、线程饥饿等问题。在并发编程中,这些问题无疑都是需要解决的。所以,在铂金系列文章中,我们会从并发中的问题出发,探索Java所提供的锁的能力以及它们是如何解决这些问题的。作为铂金系列文章的第一篇,我们将从Lock接口开始介绍,因为它是Java中锁的基础,也是并发能力的基础。一、理解Java中锁的基础:Lock接口在青铜系列文章中,我们介绍了通过synchronized关键字实现对方法和代码块加锁

2021-06-16 10:42:47 122

原创 黄金3:雨露均沾-不要让你的线程在竞争中被“饿死”

欢迎来到《并发王者课》,本文是该系列文章中的第13篇。在上篇文章中,我们介绍了避免死锁的几种策略。虽然死锁臭名昭著,然而在并发编程中,除了死锁之外,还有一些同样重要的线程活跃性问题值得关注。它们的知名度不高,但破坏性极强,本文将介绍的正是其中的线程饥饿和活锁问题。一、饥饿的产生所谓线程 饥饿(Starvation) 指的是在多线程的资源竞争中,存在贪婪的线程一直锁定资源不释放,其他的线程则始终处于等待状态,然而这个等待是没有结果的,它们会被活活地饿死。独占者的贪婪是饥饿产生的原因之一,概括来说,饥

2021-06-16 10:42:10 277

原创 黄金2:行稳致远-如何让你的线程免于死锁

欢迎来到《并发王者课》,本文是该系列文章中的第12篇。在上篇文章中,我们介绍了死锁的概念及其原因,本文将为你介绍的是几种常见的死锁预防策略。简单来说,预防死锁主要有三种策略:顺序化加锁;给锁一个超时期限;检测死锁。一、顺序化加锁通常,死锁的产生是由于多个线程无序请求资源造成的。资源是有限的,不可能同时满足所有线程的请求。然而,如果能按照一定的顺序分别满足各个线程的请求,那么死锁也就不再存在,也就是所谓的顺序化加锁(Lock Ordering)。举个通俗点的例子,烦人的路口堵车你一定遇到过

2021-06-16 10:41:32 122

原创 黄金1:两败俱伤-互不相让的线程如何导致了死锁僵局

欢迎来到《并发王者课》,本文是该系列文章中的第11篇。在本篇文章中,我将为你介绍多线程中的经典问题-死锁,以及死锁的产生原因、处理和方式预防措施。一、死锁的产生观察下面这幅图,线程1持有了A,但它需要B;而线程2持有了B,但是它需要A。你看,问题就来了,A、B都在等待对方已经持有的资源,并且都不释放,这就让事情陷入了僵局,也就是产生了死锁。在并发编程中,死锁表示的是一种状态。在这种状态下,各方都在等待另一方释放所持有的资源,但是它们之间又缺乏必要的通信机制,导致彼此存在环路依赖而永远地等待下去。

2021-06-16 10:40:51 132

原创 青铜10:千锤百炼-如何解决生产者与消费者经典问题

欢迎来到《并发王者课》,本文是该系列文章中的第10篇。在本篇文章中,我将为你介绍并发中的经典问题-生产者与消费者问题,并基于前面系列文章的知识点,通过wait、notify实现这一问题的简版方案。一、生产者与消费者问题生产者消费者问题(Producer-consumer problem),也称有限缓冲问题(Bounded-buffer problem),是一个多进程、线程同步问题的经典案例。这个问题描述了共享固定大小缓冲区的两个进程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产

2021-06-16 10:40:07 832

原创 青铜9:防患未然-如何处理线程中的异常

欢迎来到《并发王者课》,本文是该系列文章中的第9篇。在本篇文章中,我将为你介绍线程中异常的处理方式以及uncaughtExceptionHandler用法。一、新线程中的异常去哪了应用程序在执行过程中,难免会出现各种意外错误,如果我们没有对错误进行捕获处理,会直接影响应用的运行结果,甚至导致应用崩溃。而在应用异常处理中,多线程的异常处理是比较重要又容易犯错的地方。接下来,我们通过一段代码模拟一种常见的多线程异常处理方式。在下面的代码中,我们在主线程中创建了新线程nezhaThread,并期望在主线

2021-06-09 19:43:17 153

原创 青铜8:分工协作-从本质认知线程的状态和动作方法

欢迎来到《并发王者课》,本文是该系列文章中的第8篇。在本篇文章中,我将从多线程的本质出发,为你介绍线程相关的状态和它们的变迁方式,并帮助你掌握这块知识点。一、多线程的本质是分工协作如果你是王者的玩家,那么你一定知道王者中的众多英雄分为主要分为几类,比如法师、战士、坦克、辅助等等。一些玩家对这些分类可能并不了解,甚至会觉得,干嘛要搞得这么复杂,干不完了嘛。这…当然不可以!抱此想法的如果不是青铜玩家,想必就是战场上的那些个人英雄主义玩家,在他们眼里没有团队。然而,只有王者知道,比赛胜利的关键,在于团队的

2021-05-31 15:09:56 194

原创 青铜7:顺藤摸瓜-如何从synchronized中的锁认识Monitor.md

在前面的文章中,我们已经体验过synchronized的用法,并对锁的概念和原理做了简单的介绍。然而,你可能已经察觉到,有一个概念似乎总是和synchronized、锁这两个概念如影相随,很多人也比较喜欢问它们之间的区别,这个概念就是Monitor,也叫监视器。所以,在讲解完synchronized、锁之后,文本将为你讲解Monitor,揭示它们之间那些公开的秘密,希望你不再迷惑。首先,你要明白的是,Monitor作为一种同步机制,它并非Java所特有,但Java实现了这一机制。为了具象地理解Moni

2021-05-28 14:31:58 126

原创 青铜6:借花献佛-如何格式化Java内存工具JOL输出

在前面的文章《一探究竟-如何从synchronized理解Java对象头中的锁》中,我们介绍并体验了JOL工具。虽然JOL很赞,但它的输出对我们不是很友好,如果不借助工具,我们很难直观理解其中的含义。下面这段代码是对JOL输出的翻译,建议你收藏。代码非我所写,文末已经注明出处。import org.openjdk.jol.info.ClassLayout;import java.nio.ByteOrder;import java.util.ArrayList;import java.util.

2021-05-27 10:46:53 187

原创 青铜5:一探究竟-从synchronized理解对象头中的锁

在前面的文章《青铜4:synchronized用法初体验》中,我们已经提到锁的概念,并指出synchronized是锁机制的一种实现。可是,这么说未免太过抽象,你可能无法直观地理解锁究竟是什么?所以,本文会粗略地介绍synchronized背后的一些基本原理,让你对Java中的锁有个粗略但直观的印象。本文将分两个部分,首先你要从Mark Word中认识锁,因为对象锁的信息存在于Mark Word中,其次通过JOL工具实际体验Mark Word的变化。一、从Mark Word认识锁我们知道,在HotSp

2021-05-27 10:44:50 163

原创 青铜4:宝刀屠龙-如何使用synchronized

在前面的文章《双刃剑-理解多线程带来的安全问题》中,我们提到了多线程情况下存在的线程安全问题。本文将以这个问题为背景,介绍如何通过使用synchronized关键字解这一问题。当然,在青铜阶段,我们仍不会过多地描述其背后的原理,重点还是先体验并理解它的用法。一、从场景中体验synchronized是谁击败了主宰在峡谷中,击败主宰可以获得高额的经济收益。因此,在条件允许的情况下,大家都会争相击败主宰。于是,哪吒和敌方的兰陵王开始争夺主宰。按规矩,谁是击败主宰的最后一击,谁便是胜利的一方。假设主宰的初始

2021-05-25 17:50:09 175

原创 青铜3:兴利除弊-如何理解多线程的安全问题

在前面的两篇文章中,我们体验了线程的创建,并从OS进程层面认识了线程。现在,我们已经知晓多线程在解决一些场景问题时有特效。然而,不知你可曾想过,多线程虽然效率很高,但是它却有着你无法回避的并发问题。举个王者中常见的场景,双方10人同时进攻主宰,最后击败主宰的玩家才是真正的赢家,而且只能有一位。所以问题来了,假如这10位玩家代表10个线程,它们在并发访问同一个资源时,如何保证数据的安全性?总不至于,主宰只有一条命,可是却有多位玩家获得主宰,这显然不符合逻辑。这个简单例子的背后,是计算机系统中一个普遍且基本

2021-05-24 15:40:51 117 2

原创 青铜2:本来面目-如何认识Java中的线程

在前面的《兵分三路:如何创建多线程》文章中,我们已经通过Thread和Runnable直观地了解如何在Java中创建一个线程,相信你已经有了一定的体感。在本篇文章中,我们将基于前面的示例代码,对线程做些必要的说明,以帮助你从更基础的层面认知线程,并为后续的学习打下基础。一、从进程认知线程在上世纪的80年代中期之前,进程一直都是操作系统中拥有资源和独立运行的基本单位。可是,随着计算机的发展,人们对操作系统的吞吐量要求越来越高,并且多处理器也逐渐发展起来,进程作为基本的调度单位已经越来越不合时宜,因为它太重

2021-05-24 15:40:15 125

Architectural Styles and the Design of Network-based Software Architectures-cn

本论文是Web发展史上一篇非常重要的技术文献。出于社会责任感,译者认为极其有 必要将它介绍给国人,使国人得以一窥HTTP和URI等Web架构标准背后的基本原理。基 于相同的基本原理,Web开发者能够设计并建造出最为高效的Web应用。因此译者发起了 这一公益性的翻译项目。除了四位主要的译者以外,来自新浪公司的田乐、丁舜佳和梁晓星 也参与了第3章的部分翻译工作,对他们的辛勤工作表示感谢。此外,国内一些专家认真地 审阅了论文的译文,提出了很多中肯的评论,使得译文的质量得以保证。在此向他们表示诚 挚的感谢,他们是:庄表伟、李琳骁、金尹、孟岩、骆古道、范凯、刘新生、刘江。

2014-11-01

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除