自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(182)
  • 收藏
  • 关注

转载 Spring Security 源码分析一:Spring Security 认证过程

安全框架

2022-08-03 17:22:07 174 1

原创 马-三高系列

三高--了解下

2022-07-23 22:16:03 181

原创 面试前看看

标题高频面试题 主题讲解:B站 tojson 系列

2022-05-19 10:19:31 209

原创 Java性能调优实战------模块三:多线程性能调优

12 | 多线程之锁优化(上):深入了解Synchronized同步锁的优化方法

2021-01-08 19:26:23 219

原创 Java性能调优实战------模块二:Java 编程性能调优

03 | 字符串性能优化不容小觑,百M内存轻松存储几十G数据String对象是如何实现的?String对象的不可变性String对象的优化1.如何构建超大字符串?2.如何使用 String.intern 节省内存?3.如何使用字符串的分割方法?04 | 慎重使用正则表达式05 | ArrayList还是LinkedList?使用不当性能差千倍初识List接口ArrayList是如何实现的?问题1:我们在查看ArrayList的实现类源码时,你会发现对象数组elem

2021-01-07 20:30:15 264

原创 Java性能调优实战------模块一:概述

01 | 如何制定性能调优标准?

2021-01-06 20:47:54 230

原创 Java业务开发常见错误100例------②设计篇 (7讲)

21 | 代码重复:搞定代码重复的三个绝招利用工厂模式 + 模板方法模式,消除 if…else 和重复代码假设要开发一个购物车下单的功能,针对不同用户进行不同处理:普通用户需要收取运费,运费是商品价格的 10%,无商品折扣;VIP 用户同样需要收取商品价格 10% 的快递费,但购买两件以上相同商品时,第三件开始享受一定折扣;内部用户可以免运费,无商品折扣。针对上面问题:我们就利用工厂模式 + 模板方法模式,不仅消除了重复代码,还避免了修改既有代码的风险。这就是设计模式中的开闭原则:对修

2020-12-31 17:12:09 1430

原创 Java业务开发常见错误100例------①代码篇 (23讲)

01 | 使用了并发工具类库,线程安全就高枕无忧了吗?ThreadLocal 使用的注意点ConcurrentHashMap 只能保证提供的原子性读写操作是线程安全的。符合操作时需要注意原子性使用了 ConcurrentHashMap,不代表对它的多个操作之间的状态是一致的,是没有其他线程在操作它的,如果需要确保需要手动加锁。诸如 size、isEmpty 和 containsValue 等聚合方法,在并发情况下可能会反映 ConcurrentHashMap 的中间状态。因此在并发情况下,这些方

2020-12-28 16:43:33 3648

原创 设计原则与思想:设计原则

15 | 理论一:对于单一职责原则,如何判定某个类的职责是否够“单一”?如何理解单一职责原则(SRP)?那就是:一个类或者模块只负责完成一个职责(或者功能)。如何判断类的职责是否足够单一?我们可以先写一个粗粒度的类,满足业务需求。随着业务的发展,如果粗粒度的类越来越庞大,代码越来越多,这个时候,我们就可以将这个粗粒度的类,拆分成几个更细粒度的类。这就是所谓的持续重构类的职责是否设计得越单一越好?16 | 理论二:如何做到“对扩展开放、修改关闭”?扩展和修改各指什么?大部分设计模式都是为了解决代

2020-11-14 22:13:58 243

原创 设计原则与思想:面向对象

设计模式学习导读 (3讲)01 | 为什么说每个程序员都要尽早地学习并掌握设计模式相关知识?应对面试中的设计模式相关问题告别写被人吐槽的烂代码提高复杂代码的设计和开发能力如何分层、分模块?应该怎么划分类?每个类应该具有哪些属性、方法?怎么设计类之间的交互?该用继承还是组合?该使用接口还是抽象类?怎样做到解耦、高内聚低耦合?该用单例模式还是静态方法?用工厂模式创建对象还是直接 new 出来?如何避免引入设计模式提高扩展性的同时带来的降低可读性问题?……各种问题,一下子挤到了我面前。让读源

2020-11-03 09:56:10 211

原创 spring 学习 point

org.springframework.core.io.ResourceSpring 常用的一些工具类

2020-06-26 23:31:05 352

原创 32个Java面试必考点

Java面试 32个核心必考点完全解析(上)【附视频地址】Java面试 32个核心必考点完全解析(下)Java面试 32个核心必考点完全解析拉勾网《32个Java面试必考点》学习笔记32个java面试必考点-视频

2020-05-27 21:10:27 223

原创 小面一下

2020-05-25 22:36:12 153

转载 四种分布式session解决方案

2020-05-18 22:03:19 201

原创 初步认识微服务架构

资料链接:http://t.cn/RQs9iTw学习链接微服务定义微服务的利利和弊康威法则微服务的适用性单块优先微服务组织架构中台战略略和微服务服务分层概念微服务总体架构体系图服务发现案例,第一种,f5+nginx,第二种,eureka+ribbon,第三种,istio+envoy常见负载均衡算法微服务网关Netflix Zuul 网关架构微服务服务发现路路由体系微服务配置中心原理理RPC vs REST服务框架和治理

2020-05-17 15:21:02 257

原创 测试 Thread 状态

@Slf4j(topic = "c.TestState")public class TestState { public static void main(String[] args) throws IOException { Thread t1 = new Thread("t1") { @Override public void run() { log.debug("running..."); .

2020-05-11 22:25:26 240

原创 AQS

AQS

2020-05-11 21:36:43 107

原创 其他多线程设计模式

观察者设计模式观察线程的生命周期//使用观察者设计模式观察线程的生命周期 被观察者是Threadpublic abstract class ObservableRunnable implements Runnable { final protected LifeCycleListener listener; //观察者 public ObservableRunnable...

2020-04-23 21:33:52 228

原创 设计模式模块答疑

话题:设计模式模块热点问题答疑多线程设计模式是前人解决并发问题的经验总结,当我们试图解决一个并发问题时,首选方案往往是使用匹配的设计模式,这样能避免走弯路。同时,由于大家都熟悉设计模式,所以使用设计模式还能提升方案和代码的可理解性。避免共享的设计模式Immutability模式、Copy-on-Write模式和线程本地存储模式本质上都是为了避免共享,只是实现手段不同而已。这3种设计模式的实现...

2020-04-23 21:14:10 208

原创 生产者-消费者模式:用流水线思想提高效率

话题:生产者-消费者模式:用流水线思想提高效率Worker Thread模式类比的是工厂里车间工人的工作模式。但其实在现实世界,工厂里还有一种流水线的工作模式,类比到编程领域,就是生产者-消费者模式。生产者-消费者模式在编程领域的应用也非常广泛,前面我们曾经提到,Java线程池本质上就是用生产者-消费者模式实现的,所以每当使用线程池的时候,其实就是在应用生产者-消费者模式。当然,除了在线程池...

2020-04-23 20:59:09 664

原创 Two Phase Termination 设计模式:两阶段终止模式

话题:两阶段终止模式:如何优雅地终止线程?启动多线程去执行一个异步任务。既启动,那又该如何终止呢?今天咱们就从技术的角度聊聊如何优雅地终止线程,正所谓有始有终。线程执行完或者出现异常就会进入终止状态。这样看,终止一个线程看上去很简单啊!一个线程执行完自己的任务,自己进入终止状态,这的确很简单。不过我们今天谈到的“优雅地终止线程”,不是自己终止自己,而是在一个线程T1中,终止线程T2;这里所谓的...

2020-04-23 20:31:26 1263 2

原创 Worker Thread模式:如何避免重复创建线程

话题:Worker Thread模式:如何避免重复创建线程?在上一篇文章中,我们介绍了一种最简单的分工模式——Thread-Per-Message模式,对应到现实世界,其实就是委托代办。这种分工模式如果用Java Thread实现,频繁地创建、销毁线程非常影响性能,同时无限制地创建线程还可能导致OOM,所以在Java领域使用场景就受限了。要想有效避免线程的频繁创建、销毁以及OOM问题,就不得不...

2020-04-22 22:51:22 1238

原创 Thread-Per-Message模式:one to one 最简单实用的分工方法

话题:Thread-Per-Message模式:最简单实用的分工方法我们曾经把并发编程领域的问题总结为三个核心问题:分工、同步和互斥。其中,同步和互斥相关问题更多地源自微观,而分工问题则是源自宏观。我们解决问题,往往都是从宏观入手,在编程领域,软件的设计过程也是先从概要设计开始,而后才进行详细设计。同样,解决并发编程问题,首要问题也是解决宏观的分工问题。并发编程领域里,解决分工问题也有一系列的...

2020-04-22 22:00:07 378

原创 Balking模式:再谈线程安全的单例模式

话题:Balking模式:再谈线程安全的单例模式上一篇文章中,我们提到可以用**“多线程版本的if”**来理解Guarded Suspension模式,不同于单线程中的if,这个“多线程版本的if”是需要等待的,而且还很执着,必须要等到条件为真。但很显然这个世界,不是所有场景都需要这么执着,有时候我们还需要快速放弃。需要快速放弃的一个最常见的例子是各种编辑器提供的自动保存功能。自动保存功能的实...

2020-04-22 21:51:33 127

原创 Guarded Suspension模式:等待唤醒机制

话题:Guarded Suspension模式:等待唤醒机制的规范实现前不久,同事小灰工作中遇到一个问题,他开发了一个Web项目:Web版的文件浏览器,通过它用户可以在浏览器里查看服务器上的目录和文件。这个项目依赖运维部门提供的文件浏览服务,而这个文件浏览服务只支持消息队列(MQ)方式接入。消息队列在互联网大厂中用的非常多,主要用作流量削峰和系统解耦。在这种接入方式中,发送消息和消费结果这两个操...

2020-04-22 21:27:58 197

原创 线程本地存储模式:ThreadLocal

话题:线程本地存储模式:没有共享,就没有伤害线程封闭,其本质上就是避免共享。你已经知道通过局部变量可以做到避免共享,那还有没有其他方法可以做到呢?有的,Java语言提供的线程本地存储(ThreadLocal)就能够做到。下面我们先看看ThreadLocal到底该如何使用。ThreadLocal的使用方法下面这个静态类ThreadId会为每个线程分配一个唯一的线程Id,如果一个线程前后两次调用...

2020-04-22 21:00:07 475

原创 Copy-on-Write模式:写时复制

话题:Copy-on-Write模式:不是延时策略的COW在上一篇文章中我们讲到Java里String这个类在实现replace()方法的时候,并没有更改原字符串里面value[]数组的内容,而是创建了一个新字符串,这种方法在解决不可变对象的修改问题时经常用到。如果你深入地思考这个方法,你会发现它本质上是一种Copy-on-Write方法。所谓Copy-on-Write,经常被缩写为COW或者C...

2020-04-22 20:33:01 5302

原创 Immutability模式: 不可变对象设计模式

话题: Immutability模式:如何利用不变性解决并发问题?“多个线程同时读写同一共享变量存在并发问题”,这里的必要条件之一是读写,如果只有读,而没有写,是没有并发问题的。解决并发问题,其实最简单的办法就是让共享变量只有读操作,而没有写操作。这个办法如此重要,以至于被上升到了一种解决并发问题的设计模式:不变性(Immutability)模式。**所谓不变性,简单来讲,就是对象一旦被创建之...

2020-04-22 20:13:43 390

原创 Java并发编程实战第二部分学习记录

14 | Lock和Condition(上):隐藏在并发包中的管程并发编程领域,有两大核心问题:一个是互斥,即同一时刻只允许一个线程访问共享资源;另一个是同步,即线程之间如何通信、协作。这两大问题,管程都是能够解决的。Java SDK并发包通过Lock和Condition两个接口来实现管程,其中Lock用于解决互斥问题,Condition用于解决同步问题。再造管程的理由这三种方案可以全面...

2020-04-21 22:48:25 186

原创 Java并发编程实战第一部分学习记录

01 | 可见性、原子性和有序性问题:并发编程Bug的源头并发程序幕后的故事源头之一:缓存导致的可见性问题源头之二:线程切换带来的原子性问题源头之三:编译优化带来的有序性问题总结02 | Java内存模型:看Java如何解决可见性和有序性问题什么是Java内存模型?使用volatile的困惑Happens-Before 规则前面一个操作的结果对后续操作是可见的...

2020-04-21 21:22:39 125

原创 分布式缓存 与 数据库 数据一致性问题

以redis与数据库缓存一致性为例redis缓存与数据库一致性简单介绍解决方案一、实时同步对强一致要求比较高的,应采用实时同步方案,即查询缓存查询不到再从DB查询,保存到缓存;更新缓存时,先更新数据库,再将缓存的设置过期(建议不要去更新缓存内容,直接设置缓存过期)。@Cacheable:查询时使用,注意Long类型需转换为Sting类型,否则会抛异常@CachePut:更新时使用,使用...

2020-04-10 22:24:20 681

原创 分布式锁

学习链接

2020-04-10 22:12:20 77

转载 分布式id生成方案

ID是数据的唯一标识,传统的做法是利用UUID和数据库的自增ID,在互联网企业中,大部分公司使用的都是Mysql,并且因为需要事务支持,所以通常会使用Innodb存储引擎,UUID太长以及无序,所以并不适合在Innodb中来作为主键,自增ID比较合适,但是随着公司的业务发展,数据量将越来越大,需要对数据进行分表,而分表后,每个表中的数据都会按自己的节奏进行自增,很有可能出现ID冲突。这时就需要一个...

2020-04-10 22:03:17 421

原创 第 10 章 Netty 核心源码剖析②

Pipeline Handler HandlerContext 创建源码剖析ChannelPipeline 调度 handler 的源码剖析源码剖析目的Netty 中的 ChannelPipeline 、 ChannelHandler 和 ChannelHandlerContext 是非常核心的组件, 我们从源码来分析Netty 是如何设计这三个核心组件的,并分析是如何创建和协调工作的.C...

2020-04-08 23:44:00 197

原创 第 10 章 Netty 核心源码剖析①

Netty 启动过程源码剖析Netty 接受请求过程源码剖析Pipeline Handler HandlerContext 创建源码剖析ChannelPipeline 调度 handler 的源码剖析Netty 心跳(heartbeat)服务源码剖析Netty 核心组件 EventLoop 源码剖析handler 中加入线程池和 Context 中添加线程池的源码剖析TODO…...

2020-04-05 20:04:22 175

原创 第 11 章用 Netty 实现 Dubbo RPC

11.1 RPC 基本介绍RPC(Remote Procedure Call)— 远程过程调用,是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程两个或多个应用程序都分布在不同的服务器上,它们之间的调用都像是本地方法调用一样3) 常见的 RPC 框架有: 比较知名的如阿里的Dubbo、google的gRPC、Go语言...

2020-04-05 20:03:58 185

原创 第 9 章 TCP 粘包和拆包及解决方案

9.1 TCP 粘包和拆包基本介绍TCP 是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的 socket,因此,发送端为了将多个发给接收端的包,更有效的发给对方,使用了优化方法(Nagle 算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样做虽然提高了效率,但是接收端就难于分辨出完整的数据包了,因为面向流的通信是无消息保护边...

2020-04-04 11:01:10 270

原创 第 8 章 Netty 编解码器和 handler 的调用机制

8.1 基本说明netty 的组件设计:Netty 的主要组件有 Channel、EventLoop、ChannelFuture、ChannelHandler、ChannelPipe 等ChannelHandler 充当了处理入站和出站数据的应用程序逻辑的容器。例如,实现 ChannelInboundHandler 接口(或ChannelInboundHandlerAdapter),你...

2020-04-03 22:26:58 669

原创 第 7 章 Google Protobuf

7.1 编码和解码的基本介绍编写网络应用程序时,因为数据在网络中传输的都是二进制字节码数据,在发送数据时就需要编码,接收数据时就需要解码codec(编解码器) 的组成部分有两个:decoder(解码器)和 encoder(编码器)。encoder 负责把业务数据转换成字节码数据,decoder 负责把字节码数据转换成业务数据7.2 Netty 本身的编码解码的机制和问题分析...

2020-04-03 20:38:27 120

原创 第 6 章 Netty 核心模块组件

6.1 Bootstrap、ServerBootstrap6.2 Future、ChannelFutureNetty 中所有的 IO 操作都是异步的,不能立刻得知消息是否被正确处理。但是可以过一会等它执行完成或者直接注册一个监听,具体的实现就是通过 Future 和 ChannelFuture,他们可以注册一个监听,当操作执行成功或失败时监听会自动触发注册的监听事件常见的方法有Cha...

2020-04-02 22:45:40 182

空空如也

空空如也

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

TA关注的人

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