首页 文章
  • ThreadLocal 源码解读

    1. 背景 ThreadLocal源码解读,网上面早已经泛滥了,大多比较浅,甚至有的连基本原理都说的很有问题,包括百度搜索出来的第一篇高访问量博文,说ThreadLocal内部有个map,键为线程对象,太误导人了。 ThreadLocal非常适合对Java多线程编程感兴趣的程序员作为入门类阅读,原因两方面: 加上注释源码也不过七八百行。 结构清晰,代码简洁。本文重点导读ThreadLocal中的...
  • 深入解析 Java 容器类List、Set、Map

    本篇文章带你从Java源码深入解析关于Java容器的概念。 参考文献: Java容器相关知识全面总结 Java官方API文档 1 常用容器继承关系图 先上一张网上的继承关系图集合继承关系图个人觉得有些地方不是很准确,比如Iterator不是容器,只是一个操作遍历集合的方法接口,所以不应该放在里面。并且Map不应该继承自Collection。所以自己整理了一个常用继承关系图如下New集合继承...
  • Spring 事务管理机制

    Spring支持两种方式的事务管理: 编程式事务管理: 通过Transaction Template手动管理事务,实际应用中很少使用, 使用XML配置声明式事务: 推荐使用(代码侵入性最小),实际是通过AOP实现实现声明式事务的四种方式: 基于 TransactionInterceptor 的声明式事务: Spring 声明式事务的基础,通常也不建议使用这种方式,但是与前面一样,了解这...
  • Git 分支管理实践

    Git 是目前最流行的源代码管理工具。大量的软件项目由 GitHub、Bitbucket 和 GitLab 这样的云服务平台或是私有的 Git 仓库来管理。在使用 Git 时通常会遇到的一个问题是采用何种分支管理实践,即如何管理仓库中作用不同的各类分支。和软件开发中的其他实践一样,Git 分支管理并没有普遍适用的最佳做法,而只有对每个团队和项目而言最适合的做法。简单来说,在项目开发中使用多个分支...
  • JVM 内存分配及 GC 详解

    JVM中的内存使用方式,包括虚拟机内存区域的划分,Java对象分配时的处理原则和逻辑,以及我们日常开发中最需要关心的GC回收的策略和算法,是开发出拥有出色而稳定的Java软件产品所必须深刻理解的。从各种途径阅读到的讲解JVM内存管理,GC过程和策略的资料也都从不同的侧重点讲述了这些话题。我在这里按照自己的理解总结一下,算是整理下自己的思路,以让自己JVM方面的知识体系结构化,打下更扎实的基础。 ...
  • Java中Optional类的使用

    从 Java 8 引入的一个很有趣的特性是Optional类。Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都非常了解的异常。本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。 Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现。但是 Opti...
  • Java设计模式之工厂模式

    设计模式要求我们应该针对接口编程,而不是针对实现编程,所谓的针对实现编程指的就是我们代码中利用new实例的对象,当对象有变动时,我们也需要修改对应的类,违反开闭原则,也会使我们代码的耦合度变高,工厂模式的作用就是将实例化对象的过程交由专门的工厂类来实现,我们要做的只是调用,不需要关心对象的生成过程。 设计模式可以分为三大类: 创建型模式(五种):工厂方法模式,抽象工厂模式,单例模式,建造者模...
  • Java 日期格式化工具类(兼容 Date 与 LocalDateTime)

    public class DateUtils { private static final String DEFAULT_DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; public static String format(Date date) { return format(date, DEFAULT...
  • Spring Boot 实现对 Fat Jar jsp 的支持

    spring boot 对于jsp支持的限制 对于jsp的支持,Spring Boot官方只支持了war的打包方式,不支持fat jar。参考官方文档 这里spring boot官方说是tomcat的问题,实际上是spring boot自己改变了打包格式引起的。 原来的结构之下,tomcat是可以扫描到fat jar里的 META-INF/resources 目录下面的资源的。在增加了 BOOT-...
  • MySql 数据误删除恢复

    在开发中,可能会遇到误删除数据库的问题,对于MySQL数据库来说,可以使用基于 binlog 的方式生成反向操作的SQL语句来实现,是MySQL中一个非常实用的功能。 在格式为 binlog 格式的日志模式下,不仅记录了数据库中曾经执行的增删改信息,而且包含了反向信息。比如当执行 delete from table where id = 1; 时,将会生成: delete from table w...
  • 使用 Java CompletableFuture 实现异步编程

    在 Java 中使用异步编程,有一种方式是使用 RxJava, 其实 Java 本身的库中的 CompletableFuture 也可以很好的应对异步编程中的大部分场景。 这篇文章将介绍 Java 8 的 CompletionStage API 和它的标准实现 CompletableFuture。API通过例子的方式演示了它的行为,每个例子演示一到两个行为。 既然 CompletableFut...
  • Swagger UI 集成 OAuth2 授权服务

    在开发 Rest API 时,经常会使用 Swagger 进行 API 测试,但是 API 通常情况下都是受保护的,需要携带 token 才能访问,本文将介绍在 Spring Boot 中,Swagger 集成 OAuth2 服务。 本文所使用的环境: Java8 Spring Boot 2.0 Spring OAuth2 Keycloak OAuth2 认证服务器 Gradle 首先是 ...
  • 使用 Filebeat 收集日志

    本篇文章中,将介绍使用 filebeat + logstash + elasticsearch 进行日志收集和展示。 安装 Filebeat 此处只介绍 Windows 下面的安装,至于其他系统, 请参考:官方文档 下载并解压后,有两种方式运行,一种是注册为 Windows 服务,另一种是直接通过命令行运行;下面分别介绍两种方式。注册为 Windows 服务前提:系统必须有 PowerShel...
  • Spring Boot Jar 包部署脚本

    当使用 Spring Boot 进行开发时,它可以将项目打包成 Jar 包进行部署,但是我们的部署环境一般都是 Linux,每次手写脚本很烦人,所以我提供了一个简单的脚本,用于部署 Spring Boot 生成的 Jar 包。脚本内容很简单,就是通过端口 kill 掉旧的进程,并将新的 Jar 包部署上去。 #!/bin/bash port=8090 jar_name="上传到服务器上...
  • 深入Spring Boot:快速集成Dubbo + Hystrix

    原文出处:hengyunabc 背景 Dubbo是Alibaba开源的、目前国内最流行的 java RPC 框架。而 Hystrix 旨在通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。它具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能。本文将介绍在 Spring Boot 中 结合 Dubbo和Hystrix。 htt...
  • JAVA 同步实现原理

    原文出处:winger@文哥 Synchronized 的基本使用 Synchronized 是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized 的作用主要有三个: 确保线程互斥的访问同步代码 保证共享变量的修改能够及时可见 有效解决重排序问题。 从语法上讲,Synchronized 总共有三种用法: 修饰普通方法 修饰静态方法 修饰代码块 接下来我...
  • Java日志框架:logback详解

    原文出处:五月的仓颉 为什么使用logback 记得前几年工作的时候,公司使用的日志框架还是 log4j,大约从16年中到现在,不管是我参与的别人已经搭建好的项目还是我自己主导的项目,日志框架基本都换成了 logback,总结一下,logback 大约有以下的一些优点: 内核重写、测试充分、初始化内存加载更小,这一切让 logback 性能和 log4j 相比有诸多倍的提升 logback 非常...
  • Java日志框架:slf4j作用及其实现原理

    原文出处:五月的仓颉 简单回顾门面模式 slf4j是门面模式的典型应用,因此在讲slf4j前,我们先简单回顾一下门面模式, 门面模式,其核心为外部与一个子系统的通信必须通过一个统一的外观对象进行,使得子系统更易于使用。用一张图来表示门面模式的结构为: 门面模式的核心为Facade即门面对象,门面对象核心为几个点: 知道所有子角色的功能和责任 将客户端发来的请求委派到子系统中,没有实际业务逻辑 ...
  • Java 设计模式之策略模式

    策略模式简介 定义 定义一系列的算法,把每一个算法封装起来,并且使它们可以相互替换。策略模式能使算法与用户端而独立存在与变化。 例子 某商场为迎接国庆的到来,决定开启商品促销活动,活动细节如下针对不同会员等级优惠的折扣有所不同,同时与消费金额所关联,消费金额在不同范围折扣优惠率也不一样。 普通会员:没有任何优惠折扣 初级会员:消费100-200元有5%的促销折扣,消费200(含200)以上元...
  • java 泛型详解-绝对是对泛型方法讲解最详细的

    1. 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。 什么是泛型?为什么要使用泛型? 泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类...
  • Java 泛型之类型擦除

    泛型没有其看起来那么深不可测,它并不神秘与神奇。泛型是 Java 中一个很小巧的概念,但同时也是一个很容易让人迷惑的知识点,它让人迷惑的地方在于它的许多表现有点违反直觉。 文章开始的地方,先给大家奉上一道经典的测试题。 List<String> l1 = new ArrayList<String>(); List<Integer> l2 = new ArrayL...
  • Java 反射机制详解

    java反射机制 一、概述1、什么是反射机制 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。2、反射机制能做什么反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类; 在运行时构造任意一个类的对象; 在运行时判断任意一个类所...
  • CentOS 7设置Samba共享目录

    1. 安装Samba服务 yum -y install samba # 查看yum源中Samba版本 yum list | grep samba # 查看samba的安装情况 rpm -qa | grep samba Samba服务器安装完之后, 会生成配置文件目录/etc/samba, /etc/samba/smb.conf是samba的核心配置文件. 2. 启动Samba服务 Samba服务...
  • Spring的事件机制详解

    同步事件和异步事件 同步事件: 在一个线程里,按顺序执行业务,做完一件事再去做下一件事。 异步事件: 在一个线程里,做一个事的同事,可以另起一个新的线程执行另一件事,这样两件事可以同时执行。   用一个例子来解释同步事件和异步事件的使用场景,有时候一段完整的代码逻辑,可能分为几部分,拿最常见的注册来说,假设完整流程是,1.点击注册->2.检验信息并存库->3.发送邮件通知->...
  • Spring Cloud Eureka - 服务发现与注册中心

    服务治理可以说是微服务架构中最为核心和基础的模块, 它主要用来实现各个微服务 实例的自动化注册与发现。 为什么我们在微服务架构中那么需要服务治理模块呢?微服务 系统没有它会有什么不好的地方吗? ​ 在最初开始构建微服务系统的时候可能服务并不多, 我们可以通过做一些静态配置来 完成服务的调用。 比如,有两个服务 A 和 B, 其中服务 A 需要调用服务 B 来完成一个业务 操作时, 为了实现服务...
  • Java 线程池详解

    在我们的开发中“池”的概念并不罕见,有数据库连接池、线程池、对象池、常量池等等。下面我们主要针对线程池来一步一步揭开线程池的面纱。 使用线程池的好处 降低资源消耗:可以重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性:线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程...
  • Spring Bean 生命周期详解

    在Spring中Bean可谓是一个核心的元素,当我们结合Spring进行编程的时候也离不开Bean,面对这样重要的一个角色,了解其生命周期和该生命周期所涉及的环节对我们更加熟练灵活地使用Bean是很有Bean必要的,下面我们就来详细分析下Bean的生命周期吧。 生命周期流程图 我们先通过一个流程图,对Bean的生命周期先做一个整体的认识和了解。   若容器实现了流程图中涉及的接口,程序将按照...
  • JVM内幕:Java虚拟机详解

    这篇文章解释了Java 虚拟机(JVM)的内部架构。下图显示了遵守Java SE 7 规范的典型的 JVM 核心内部组件。 上图显示的组件分两个章节解释。第一章讨论针对每个线程创建的组件,第二章节讨论了线程无关组件。 线程 JVM 系统线程 每个线程相关的 程序计数器 栈 本地栈 栈限制 栈帧 局部变量数组 操作数栈 动态链接 线程共享 堆 内存管理 非堆内存 即时编译 方法区 类文件结构 类加...
  • 改变你写代码的方式 - Java 10 的 10 个新特性!

    Java 9才发布几个月,很多玩意都没整明白,现在Java 10又要来了。。 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK 10…… 刚学Java的同学是不是感觉一脸蒙逼?!!! Java 更新越来越快,我们做技术的也要跟上步伐,不然总会慢别人一拍,这新东西从国外到国内应用一般要好几年的时间,如果我们提前了解并应用这些新技...
  • 史上最难的一道Java面试题

    无意中了解到如下题目,觉得蛮好。 题目如下 public class TestSync2 implements Runnable { int b = 100; synchronized void m1() throws InterruptedException { b = 1000; Thread.sleep(500); //6 ...

热门问题