<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Java_Cappuccino的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Java_Cappuccino</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Java_Cappuccino]]></copyright><item><title><![CDATA[使用了并发工具类库，线程安全就高枕无忧了吗？]]></title><link>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/108268764</link><guid>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/108268764</guid><author>Java_Cappuccino</author><pubDate>Thu, 27 Aug 2020 21:10:28 +0800</pubDate><description><![CDATA[本文已收录GitHub，更有互联网大厂面试真题，面试攻略，高效学习资料等

在代码审核讨论的时候，我们有时会听到有关线程安全和并发工具的一些片面的观点和结论，比如“把 HashMap 改为 ConcurrentHashMap，就可以解决并发问题了呀”“要不我们试试无锁的 CopyOnWriteArrayList 吧，性能更好”。事实上，这些说法都不太准确。
的确，为了方便开发者进行多线程编程，现代编程语言会提供各种并发工具类。但如果我们没有充分了解它们的使用场景、解决的问题，以及最佳实践的话，盲目使用就..]]></description><category></category></item><item><title><![CDATA[对面新来的阿里架构师：如何利用Kafka分析一个软件的实现？]]></title><link>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/108208355</link><guid>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/108208355</guid><author>Java_Cappuccino</author><pubDate>Mon, 24 Aug 2020 20:52:54 +0800</pubDate><description><![CDATA[本文已收录GitHub，更有互联网大厂面试真题，面试攻略，高效学习资料等

在一个系统中，模型和接口是相对稳定的部分。但是，同样的模型和接口，如果采用不同的实现，稳定性、可扩展性和性能等诸多方面相差极大。而且，只有了解实现，你才有改动代码的基础。
但是，不得不说，“看实现”是一个很大的挑战，因为有无数的细节在那里等着你。所以，在很多团队里，一个新人甚至会用长达几个月的时间去熟悉代码中的这些细节。
面对这种情况，我们该怎么办呢？
首先，你要记住一件事，你不太可能记住真实项目的所有细节，甚至到你离开项目的那..]]></description><category></category></item><item><title><![CDATA[如何使用性能分析工具定位SQL执行慢的原因？]]></title><link>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/108110068</link><guid>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/108110068</guid><author>Java_Cappuccino</author><pubDate>Wed, 19 Aug 2020 20:36:16 +0800</pubDate><description><![CDATA[本文已收录GitHub，更有互联网大厂面试真题，面试攻略，高效学习资料等

在前面的文章中就讲过了查询优化器，知道在查询优化器中会经历逻辑查询优化和物理查询优化。需要注意的是，查询优化器只能在已经确定的情况下（SQL 语句、索引设计、缓冲池大小、查询优化器参数等）决定最优的查询执行计划。
但实际上 SQL 执行起来可能还是很慢，那么到底从哪里定位 SQL 查询慢的问题呢？是索引设计的问题？服务器参数配置的问题？还是需要增加缓存的问题呢？今天我们就从性能分析来入手，定位导致 SQL 执行慢的原因。
今天的..]]></description><category></category></item><item><title><![CDATA[阿里架构师细说分布式之集中式结构，愿下次面试不再有分布式]]></title><link>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/108010801</link><guid>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/108010801</guid><author>Java_Cappuccino</author><pubDate>Fri, 14 Aug 2020 17:47:46 +0800</pubDate><description><![CDATA[本文已收录GitHub，更有互联网大厂面试真题，面试攻略，高效学习资料等

云这个话题对我们来说已经非常熟悉了。可以说，云在我们的生活中无处不在，比如我们平时看的视频通常就是放在云上的。当我们要播放一段视频时，请求会先转发到云上，从云上下载数据到本地，然后播放。在这里，你肯定会疑惑，云上资源那么丰富吗，可以存放这么多东西吗？
云上的资源确实丰富，因为它可以尽可能地把更多的服务器组织起来，作为一个统一的资源，为多个用户提供服务。这里的重点是，把多个服务器管理起来，作为一个统一的资源提供服务。而如何组织，就是.]]></description><category></category></item><item><title><![CDATA[详解Linux系统安全：多人共用服务器，如何防止别人干“坏事”？]]></title><link>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107941138</link><guid>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107941138</guid><author>Java_Cappuccino</author><pubDate>Tue, 11 Aug 2020 17:57:58 +0800</pubDate><description><![CDATA[本文已收录GitHub，更有互联网大厂面试真题，面试攻略，高效学习资料等

本文就讨论一下 Linux 系统和应用安全。我们知道，在开发一个应用的过程中，需要涉及代码、操作系统、网络和数据库等多个方面。所以，只是了解代码安全肯定是不够的，我们还需要了解常见的基础环境和工具中的安全机制，学会通过正确地配置这些安全机制，来提升安全保障。
谈到 Linux，我相信你每天都在使用 Linux 进行各种开发和运维操作。但是，大多数情况下，公司不会给每一个员工分配专有的 Linux 服务器，而是多个开发和运维共用一台.]]></description><category></category></item><item><title><![CDATA[阿里架构师剖析：Redis常用数据类型对应的数据结构]]></title><link>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107845181</link><guid>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107845181</guid><author>Java_Cappuccino</author><pubDate>Thu, 06 Aug 2020 17:19:54 +0800</pubDate><description><![CDATA[本文已收录GitHub，更有互联网大厂面试真题，面试攻略，高效学习资料等

本文就带大家一块儿看下，经典数据库 Redis 中的常用数据类型，底层都是用哪种数据结构实现的？
Redis数据库介绍
Redis 是一种键值（Key-Value）数据库。相对于关系型数据库（比如 MySQL），Redis也被叫作非关系型数据库。
像 MySQL 这样的关系型数据库，表的结构比较复杂，会包含很多字段，可以通过 SQL 语句，来实现非常复杂的查询需求。而 Redis 中只包含“键”和“值”两部分，只能通过“键”来查询.]]></description><category></category></item><item><title><![CDATA[从CRUD到阿里年薪60W+的架构师，他是如何面对职业倦怠？]]></title><link>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107769569</link><guid>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107769569</guid><author>Java_Cappuccino</author><pubDate>Mon, 03 Aug 2020 17:32:41 +0800</pubDate><description><![CDATA[本文已收录GitHub，更有互联网大厂面试真题，面试攻略，高效学习资料等

成长的途中，我们总会面临很多的困扰与惶惑，这些困扰和彷徨很多都关乎选择，只有了解并认清这类困惑，我们才可能做出最合适的选择。
职业生涯的路上，每个人都会碰到职业倦怠期，我也不例外。曾经好几次，我都陷入其中。如今从中摆脱出来后，我就想尝试搞清楚这样一种状态的根源，思考一种方法来缩短它持续的时间，或者说增加它出现的时间间隔。
那职业倦怠到底是怎样的一种感受呢？
倦怠感
1974 年，美国临床心理学家弗罗伊登贝格尔（Herbert J..]]></description><category></category></item><item><title><![CDATA[阿里架构师浅析设计模式应用：编程框架中的设计模式]]></title><link>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107700099</link><guid>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107700099</guid><author>Java_Cappuccino</author><pubDate>Thu, 30 Jul 2020 20:30:38 +0800</pubDate><description><![CDATA[本文已收录GitHub，更有互联网大厂面试真题，面试攻略，高效学习资料等

在绝大多数情况下，我们开发应用程序的时候，并不是从头开发的。比如，我们用 Java 开发一个 Web 应用，并不需要自己写代码监听 HTTP 80 端口；不需要处理网络传输的二进制 HTTP 数据包；不需要亲自为每个用户请求分配一个处理线程，而是直接编写一个 Servlet，得到一个HttpRequest 对象进行处理就可以了。我们甚至不需要从这个 HttpRequest 对象中获取请求参数，通过 Controller 就可以直接.]]></description><category></category></item><item><title><![CDATA[阿里架构师剖析程序运行原理，程序是如何运行又是如何崩溃的？]]></title><link>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107621619</link><guid>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107621619</guid><author>Java_Cappuccino</author><pubDate>Mon, 27 Jul 2020 21:18:15 +0800</pubDate><description><![CDATA[本文已收录GitHub，更有互联网大厂面试真题，面试攻略，高效学习资料等

软件的核心载体是程序代码，软件开发的主要工作产出也是代码，但是代码被存储在磁盘上本身没有任何价值，软件要想实现价值，代码就必须运行起来。那么代码是如何运行的？在运行中可能会出现什么问题呢？
一、程序是如何运行起来的
软件被开发出来，是文本格式的代码，这些代码通常不能直接运行，需要使用编译器编译成操作系统或者虚拟机可以运行的代码，即可执行代码，它们都被存储在文件系统中。不管是文本格式的代码还是可执行的代码，都被称为程序，程序是静态的.]]></description><category></category></item><item><title><![CDATA[程序员也可以“砍”需求吗？]]></title><link>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107569563</link><guid>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107569563</guid><author>Java_Cappuccino</author><pubDate>Fri, 24 Jul 2020 20:56:25 +0800</pubDate><description><![CDATA[本文已收录GitHub，更有互联网大厂面试真题，面试攻略，高效学习资料等

我们前面讲的任务分解，主要是在讲开发任务的分解。今天我们换个角度，看看需求的分解。是的，需求也要分解。
有一次，我和一个做开发的同事聊天，他给我讲了他近期的烦恼。

同事：我们现在就是需求太多，开发的人太少，再这么干下去，哪天觉得自己抗不住了，我就拍拍屁股走人。
我：你没尝试着砍砍需求？
同事：怎么没尝试？产品的人都不同意。这批功能他们都说是关键功能。
我：你有没有尝试把需求拆开了再砍呢？
同事：还可以这样？

同事很惊讶，我一点.]]></description><category></category></item><item><title><![CDATA[漫谈粗放与精益：编程的两种思路与方式]]></title><link>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107548123</link><guid>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107548123</guid><author>Java_Cappuccino</author><pubDate>Thu, 23 Jul 2020 21:15:51 +0800</pubDate><description><![CDATA[本文已收录GitHub，更有互联网大厂面试真题，面试攻略，高效学习资料等

几年前，我给团队负责的整个系统写过一些公共库，有一次同事发现这个库里存在一个Bug，并告诉了我出错的现象。然后我便去修复这个 Bug，最终只修改了一行代码，但发现一上午就这么过去了。
一上午只修复了一个 Bug，而且只改了一行代码，到底发生了什么？时间都去哪里了？以前觉得自己写代码很快，怎么后来越来越慢了？我认真地思考了这个问题，开始认识到我的编程方式和习惯在那几年已经慢慢发生了变化，形成了明显的两个阶段的转变。这两个阶段是：

.]]></description><category></category></item><item><title><![CDATA[在被leader说了无数次后，终于潜下心来整理了一下JVM的类加载器]]></title><link>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107522491</link><guid>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107522491</guid><author>Java_Cappuccino</author><pubDate>Wed, 22 Jul 2020 20:29:40 +0800</pubDate><description><![CDATA[本文已收录GitHub，更有互联网大厂面试真题，面试攻略，高效学习资料等

前言
之前去面试的时候面试官问了我关于关于JVM性能调优的问题，由于自己之前公司的项目里自己没有接触到JVM性能调优的相关问题（感觉这些都是公司架构师考虑的问题），所有面试官问的时候自己一脸懵逼，所有最后的结果当然是凉凉。。，于是，为了查漏补缺，就去学习了一下JVM的相关知识，希望能帮助到大家。
正文
在学习任何一项新的知识之前，我都会先列出一份学习大纲，然后按照这个学习大纲一步一步的来学习了解，所以学习JVM这个新的技术，我也分.]]></description><category></category></item><item><title><![CDATA[在面试了阿里、腾讯众多大厂之后，我终明白了为什么需要消息队列]]></title><link>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107498263</link><guid>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107498263</guid><author>Java_Cappuccino</author><pubDate>Tue, 21 Jul 2020 20:39:36 +0800</pubDate><description><![CDATA[本文已收录GitHub，更有互联网大厂面试真题，面试攻略，高效学习资料等

消息队列是最古老的中间件之一，从系统之间有通信需求开始，就自然产生了消息队列。但是给消息队列下一个准确的定义却不太容易。我们知道，消息队列的主要功能就是收发消息，但是它的作用不仅仅只是解决应用之间的通信问题这么简单。
我们举个例子说明一下消息队列的作用。话说小袁是一家巧克力作坊的老板，生产出美味的巧克力需要三道工序：首先将可可豆磨成可可粉，然后将可可粉加热并加入糖变成巧克力浆，最后将巧克力浆灌入模具，撒上坚果碎，冷却后就是成品巧克.]]></description><category></category></item><item><title><![CDATA[为什么现在BAT面试必问分布式？阿里大牛带你实战剖析分布式锁]]></title><link>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107473521</link><guid>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107473521</guid><author>Java_Cappuccino</author><pubDate>Mon, 20 Jul 2020 21:01:20 +0800</pubDate><description><![CDATA[本文已收录GitHub，更有互联网大厂面试真题，面试攻略，高效学习资料等

为什么要使用分布锁？
首先，我先带你认识一下什么是锁。
在单机多线程环境中，我们经常遇到多个线程访问同一个共享资源（这里需要注意的是：在很多地方，这种资源会称为临界资源，但在今天这篇文章中，我们统一称之为共享资源）的情况。为了维护数据的一致性，我们需要某种机制来保证只有满足某个条件的线程才能访问资源，不满足条件的线程只能等待，在下一轮竞争中重新满足条件时才能访问资源。
这个机制指的是，为了实现分布式互斥，在某个地方做个标记，这个标.]]></description><category></category></item><item><title><![CDATA[先打好基础，阿里架构师一文带你深入理解JVM内存回收机制]]></title><link>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107393605</link><guid>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107393605</guid><author>Java_Cappuccino</author><pubDate>Thu, 16 Jul 2020 21:00:42 +0800</pubDate><description><![CDATA[本文已收录GitHub，更有互联网大厂面试真题，面试攻略，高效学习资料等

一、垃圾回收发生的区域
堆是java创建对象的区域(String对象在常量池中)，也是垃圾回收最多的地方。但是除了堆空间还有方法区存在需要回收的垃圾
回收方法区
废弃的常量
在常量池中存在一个字面量A，如果系统中没有一个地方引用`A``，这时候发生垃圾回收，如果有必要这个字面量就会被清理出常量池。
注意是如果有必要。比如上一篇文章中引用的例子，就没有回收字符串。
无用的类
当满足以下条件时，这个类就可以被回收，而不是一定会回收。
.]]></description><category></category></item><item><title><![CDATA[为什么查询数据不多,却慢的离谱,在我请教了隔壁新来的阿里大佬后]]></title><link>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107370286</link><guid>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107370286</guid><author>Java_Cappuccino</author><pubDate>Wed, 15 Jul 2020 20:59:24 +0800</pubDate><description><![CDATA[本文已收录GitHub，更有互联网大厂面试真题，面试攻略，高效学习资料等


这篇文章主要记录，造成查询数量不大的情况下，造成查询缓慢的原因，以及相应的解决方法。
环境说明：
MySQL 版本 5.7.27
隔离级别：RR

锁等待造成查询速度很慢
MDL 锁
如开启如下事务：

Session A 持有表 t MDL 写锁。Session B 需要 MDL 读锁。这时读写锁互斥，Session B 被阻塞。
flush 阻塞
flush 操作一般来说很快就能执行完，当通过查询进程状态后，看到被 flus.]]></description><category></category></item><item><title><![CDATA[为什么Spring技术很强大？]]></title><link>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107347911</link><guid>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107347911</guid><author>Java_Cappuccino</author><pubDate>Tue, 14 Jul 2020 21:23:16 +0800</pubDate><description><![CDATA[本文已收录GitHub，更有互联网大厂面试真题，面试攻略，高效学习资料等

Java 程序员几乎都了解 Spring。它的 IoC（依赖反转）和 AOP（面向切面编程）功能非常强大、易用。而它背后的字节码生成技术（在运行时，根据需要修改和生成 Java 字节码的技术）就是就是一项重要的支撑技术。
Java 字节码能够在 JVM（Java 虚拟机）上解释执行，或即时编译执行。其实，除了Java，JVM 上的 Groovy、Kotlin、Closure、Scala 等很多语言，也都需要生成字节码。另外，pla.]]></description><category></category></item><item><title><![CDATA[阿里架构师分享丨Java架构设计的重点知识和学习路径（建议收藏）]]></title><link>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107326096</link><guid>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107326096</guid><author>Java_Cappuccino</author><pubDate>Mon, 13 Jul 2020 21:53:18 +0800</pubDate><description><![CDATA[本文已收录GitHub，更有互联网大厂面试真题，面试攻略，高效学习资料等

学习架构呢，要掌握的东西有很多，你是不是开始担心自己一辈子都学不完呢？其实，我们也不需要一下子铺开学习所有的架构技能，重要的是把控好学习的节奏，在适当的时间学习适当的内容，我们可以结合实际工作，一步步地成长。所以今天这一讲，我想给你提供一些架构学习的重点方向和路径建议。
架构原则汇总
在技术架构篇，我针对系统的高可用、高性能、可伸缩和低成本，给你介绍了很多的架构设计原则，不同的原则对应着不同的目标，这里我把这些架构原则和目标汇总成.]]></description><category></category></item><item><title><![CDATA[Facebook架构师的代码审查之道：学习Facebook真正发挥代码审查的提效作用]]></title><link>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107291206</link><guid>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107291206</guid><author>Java_Cappuccino</author><pubDate>Sat, 11 Jul 2020 21:33:22 +0800</pubDate><description><![CDATA[本文已收录GitHub，更有互联网大厂面试真题，面试攻略，高效学习资料等

我见到很多国内公司也在尝试使用代码审查，但是效果很不好，往往流于形式，最常听到的一个负面反馈就是“代码审查浪费时间”。
代码审查的成功推行的确不是一件容易的事。今天，我们就一起尝试来解决这个问题。我会从三个方面给出一些建议：

第一，在团队内引入代码审查的步骤和方法；
第二，成功推进代码审查的关键操作；
第三，持续做好代码审查的重要原则。

今天的文章较长，我们现在就进入第一个部分，
引入代码审查的步骤和方法
从我的经验来看，要成.]]></description><category></category></item><item><title><![CDATA[阿里架构师详解缓存架构：如何减少不必要的计算？]]></title><link>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107238358</link><guid>https://blog.youkuaiyun.com/Java_Cappuccino/article/details/107238358</guid><author>Java_Cappuccino</author><pubDate>Thu, 09 Jul 2020 21:38:53 +0800</pubDate><description><![CDATA[本文已收录GitHub，更有互联网大厂面试真题，面试攻略，高效学习资料等

互联网应用的主要挑战就是在高并发情况下，大量的用户请求到达应用系统服务器，造成了巨大的计算压力。互联网应用的核心解决思路就是采用分布式架构，提供更多的服务器，从而提供更多的计算资源，以应对高并发带来的计算压力及资源消耗。
那么有没有办法减少到达服务器的并发请求压力呢？或者请求到达服务器后，有没有办法减少不必要的计算，降低服务器的计算资源消耗，尽快返回计算结果给用户呢？
有，解决的核心就是缓存。
所谓缓存，就是将需要多次读取的数据暂.]]></description><category></category></item></channel></rss>