
Java
文章平均质量分 93
博客菜鸟飞飞飞
blog rookie
展开
-
Springboot 是个什么玩意?
背景知识Spring 为 Java 程序提供了全面的基础架构支持,包含了很多非常实用的功能,如 Spring JDBC、Spring AOP、Spring ORM、Spring Test 等,这些模块的出现,大大的缩短了应用程序的开发时间,同时提高了应用开发的效率。Spring Boot 本质上是 Spring 框架的延伸和扩展,它的诞生是为了简化 Spring 框架初始搭建以及开发的过程,使用它可以不再依赖 Spring 应用程序中的 XML 配置,为更快、更高效的开发 Spring 提供更加有力的支原创 2020-12-15 18:55:24 · 265 阅读 · 0 评论 -
手写一个消息队列和延迟消息队列?
背景消息队列的使用场景有很多,最常见的使用场景有以下几个。1.商品秒杀比如,我们在做秒杀活动时,会发生短时间内出现爆发式的用户请求,如果不采取相关的措施,会导致服务器忙不过来,响应超时的问题,轻则会导致服务假死,重则会让服务器直接宕机,给用户带来的体验也非常不好。如果这个时候加上了消息队列,服务器接收到用户的所有请求后,先把这些请求全部写入到消息队列中再排队处理,这样就不会导致同时处理多个请求的情况;如果消息队列长度超过可以承载的最大数量,那么我们可以抛弃当前用户的请求,通知前台用户“页面出错啦,请重原创 2020-12-08 09:45:24 · 137 阅读 · 0 评论 -
本地缓存和分布式缓存如何实现?
背景缓存(Cache)是指将程序或系统中常用的数据对象存储在像内存这样特定的介质中,以避免在每次程序调用时,重新创建或组织数据所带来的性能损耗,从而提高了系统的整体运行速度。以目前的系统架构来说,用户的请求一般会先经过缓存系统,如果缓存中没有相关的数据,就会在其他系统中查询到相应的数据并保存在缓存中,最后返回给调用方。知识讲解本地缓存是指程序级别的缓存组件,它的特点是本地缓存和应用程序会运行在同一个进程中,所以本地缓存的操作会非常快,因为在同一个进程内也意味着不会有网络上的延迟和开销。本地缓存适用原创 2020-10-24 10:43:06 · 368 阅读 · 0 评论 -
动态代理是如何实现的?JDK Proxy 和 CGLib 到底有什么区别?
知识解读动态代理的常用实现方式是反射。反射机制是指程序在运行期间可以访问、检测和修改其本身状态或行为的一种能力,使用反射我们可以调用任意一个类对象,以及类对象中包含的属性及方法。但动态代理不止有反射一种实现方式,例如,动态代理可以通过 CGLib 来实现,而 CGLib 是基于 ASM(一个 Java 字节码操作框架)而非反射实现的。简单来说,动态代理是一种行为方式,而反射或 ASM 只是它的一种实现手段而已。JDK Proxy 和 CGLib 的区别主要体现在以下几个方面:JDK Proxy 是原创 2020-10-21 11:56:29 · 249 阅读 · 0 评论 -
如何手动模拟一个死锁?
背景在并发编程中有两个重要的概念:线程和锁,多线程是一把双刃剑,它在提高程序性能的同时,也带来了编码的复杂性,对开发者的要求也提高了一个档次。而锁的出现就是为了保障多线程在同时操作一组资源时的数据一致性,当我们给资源加上锁之后,只有拥有此锁的线程才能操作此资源,而其他线程只能排队等待使用此锁。典型回答死锁是指两个线程同时占用两个资源,又在彼此等待对方释放锁资源,如下图所示:死锁的代码演示如下:import java.util.concurrent.TimeUnit;public class原创 2020-10-15 13:42:24 · 643 阅读 · 0 评论 -
synchronized 和 ReentrantLock 的实现原理及区别
背景在 JDK 1.5 之前共享对象的协调机制只有 synchronized 和 volatile,在 JDK 1.5 中增加了新的机制 ReentrantLock,该机制的诞生并不是为了替代 synchronized,而是在 synchronized 不适用的情况下,提供一种可以选择的高级功能。典型回答synchronized 属于独占式悲观锁,是通过 JVM 隐式实现的,synchronized 只允许同一时刻只有一个线程操作资源。在 Java 中每个对象都隐式包含一个 monitor(监视器)原创 2020-10-14 11:26:16 · 240 阅读 · 0 评论 -
ThreadPoolExecutor 的参数含义及源码执行流程
背景线程池是为了避免线程频繁的创建和销毁带来的性能消耗,而建立的一种池化技术,它是把已创建的线程放入“池”中,当有任务来临时就可以重用已有的线程,无需等待创建的过程,这样就可以有效提高程序的响应速度。但如果要说线程池的话一定离不开 ThreadPoolExecutor ,在阿里巴巴的《Java 开发手册》中是这样规定线程池的:线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的读者更加明确线程池的运行规则,规避资源耗尽的风险。说明:原创 2020-10-13 11:57:23 · 231 阅读 · 0 评论 -
线程到底是如何工作的?
概念线程(Thread)是并发编程的基础,也是程序执行的最小单元,它依托进程而存在。一个进程中可以包含多个线程,多线程可以共享一块内存空间和一组系统资源,因此线程之间的切换更加节省资源、更加轻量化,也因此被称为轻量级的进程。...原创 2020-10-08 17:31:54 · 1086 阅读 · 0 评论 -
CAS是个什么玩意?
背景现在有多个线程想要操作同一资源对象,很多人一上来就会选择互斥锁,但是有一个问题就是:互斥锁的同步方式是悲观的。所谓悲观就是,操作系统会悲观的认为:如果不严格同步线程调用,那么一定会产生异常,所以互斥锁将会将资源进行锁定,直供一个线程调用而阻塞其他的线程,这样的同步机制叫做悲观锁。但是悲观锁不是万能的,如果在大量调用都是读操作的情况下,那么就没有必要在每次调用的时候都锁定资源。或者在一些情况下,同步代码的耗时远远小于线程切换的耗时,现在选择悲观锁的话就显得本末倒置了。这是就提出了一个问题,能否不锁定原创 2020-10-06 18:51:30 · 183 阅读 · 0 评论 -
Java锁机制是什么?(上)
什么是锁?在并发环境下,多个线程会对同一个资源进行争抢,可能会导致数据不一致的问题。为了解决这一问题,需要通过一种抽象的锁来对资源进行锁定。首先,我们需要了解JVM运行是的内存结构:图中表明红色区域是各个线程所私有的,不会出现资源竞争的问题,而蓝色区域中的数据被所有线程共享。其中Java堆中存放的是所有的对象,方法区中存放着类信息、常量、静态变量等数据。所以在多个线程在对资源进行竞争的过程中难免会出现异常情况,因此需要锁机制对其进行限制。锁机制是如何实现的?在Java中,每个对象都拥有一把锁,这原创 2020-09-18 18:10:13 · 532 阅读 · 0 评论 -
Java中的String到底是什么?(知识扩展+考点分析+源码分析)
背景知识现在几乎所有的Java面试题中都是涉及到String的问题,也是很基本的问题,对于String的知识点,我们可能只是知道:String 不属于基础类型、String不可变、String有这三个类:String、StringBuffer、StringBuilder等等。但是String是如何实现的?它有哪些重要的方法?源码分析对于现在的主流JDK版本JDK1.8,String的内部存储结构是char数组,源码如下:public final class String implements原创 2020-08-24 23:54:42 · 265 阅读 · 0 评论