随笔分类 - 技术杂说
摘要:从字面意思理解就是数据不需要来回的拷贝,大大提升了系统的性能;这个词我们也经常在java nio,netty,kafka,RocketMQ等框架中听到,经常作为其提升性能的一大亮点;下面从I/O的几个概念开始,进而在分析零拷贝。 I/O概念 缓冲区 缓冲区是所有I/O的基础,I/O讲的无非就是把数据
阅读全文
摘要:Java异常是Java提供的一种识别及响应错误的一致性机制。 Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。在有效使用异常的情况下,异常能清晰的回答what, where, why这3个问题:异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪
阅读全文
摘要:结论:String是有长度限制的。 首先要知道String的长度限制我们就需要知道String是怎么存储字符串的,String其实是使用的一个char类型的数组来存储字符串中的字符的。 那么String既然是数组存储,那数组会有长度的限制吗?是的,有限制,但是是在有先提条件下的,我们看看String
阅读全文
摘要:先列一段代码: package cn.yqh.interview; public class Singleton { private static volatile Singleton singleton = null; private Singleton() { } public static S
阅读全文
摘要:基本概念 主键、外键、超键、候选键 超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。 候选键:是最小超键,即没有冗余元素的超键。 主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数
阅读全文
摘要:我们基本已经形成了常识,需要用到金钱的地方要用BigDecimal而不是其他,而我们也都知道浮点型变量在进行计算的时候会出现丢失精度的问题。 那么,你知道其实BigDecimal也会丢失精度吗? 如下一段代码: System.out.println(0.05 + 0.01); System.out.
阅读全文
摘要:关于设计模式,如果使用得当,将会使我们的代码更加简洁,并且更具扩展性。本文主要讲解Spring中如何使用策略模式,工厂方法模式以及Builder模式。 策略模式 关于策略模式的使用方式,在Spring中其实比较简单,从本质上讲,策略模式就是一个接口下有多个实现类,而每种实现类会处理某一种情况。 Sp
阅读全文
摘要:单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点! 懒汉, 线程安全 在方法上添加synchronized。在多线程下可以很好的工作,也延迟加载了,但是效率很低,99%情况下不需要同步。 饿汉, 线程安全 定义一个static变量,直接创建单例对象,线程安全,无延迟加载。 这种方
阅读全文
摘要:单一职责原则——SRP 开闭原则——OCP 里式替换原则——LSP 依赖倒置原则——DIP 接口隔离原则——ISP 迪米特原则——LOD 单一职责原则 单一职责原则的定义是就一个类而言,应该仅有一个引起他变化的原因。也就是说一个类应该只负责一件事情(单例模式其实是违背该原则的)。如果一个类负责了方法
阅读全文
摘要:基础概念简述 逻辑架构 第一层:客户端通过连接服务,将要执行的sql指令传输过来 第二层:服务器解析并优化sql,生成最终的执行计划并执行 第三层:存储引擎,负责数据的储存和提取 锁 数据库通过锁机制来解决并发场景-共享锁(读锁)和排他锁(写锁)。读锁是不阻塞的,多个客户端可以在同一时刻读取同一个资
阅读全文
摘要:Java中创建线程主要有三种方式 继承Thread类创建线程类 定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。 创建Thread子类的实例,即创建了线程对象。 调用线程对象的start()方法来启动该线程。 Threa
阅读全文
摘要:线程池的好处 线程池的重用 线程的创建和销毁的开销是巨大的,而通过线程池的重用大大减少了这些不必要的开销,当然既然少了这么多消费内存的开销,其线程执行速度也是突飞猛进的提升。 控制线程池的并发数 并发:在某个时间段内,多个程序都处在执行和执行完毕之间;但在一个时间点上只有一个程序在运行。头脑风暴:老
阅读全文
摘要:新手常犯的错误 可能很多新手(包括当年的我)第一时间想到的写法是下面这样的: public static void main(String[] args) { List<String> platformList = new ArrayList<>(); platformList.add("博客园")
阅读全文
摘要:知识回顾 线程与进程 一个程序最少需要一个进程,而一个进程最少需要一个线程。关系是线程–>进程–>程序的大致组成结构。所以线程是程序执行流的最小单位,而进程是系统进行资源分配和调度的一个独立单位。 线程类Thread的几个重要方法 start()方法,调用该方法开始执行该线程; join方法,调用该
阅读全文
摘要:为什么使用线程池 每个请求对应一个线程方法的不足是:为每个请求创建一个新线程的开销很大;为每个请求创建新线程的服务器在创建和销毁线程上花费的时间和消耗的系统资源要比花在处理实际的用户请求的时间和资源更多。容易引起资源不足,造成浪费。为解决单个任务处理时间很短而请求的数目巨大的问题,引出线程池: 通过
阅读全文
摘要:volatile的作用 通常情况下我们可以通过Synchronized关键字来解决可见性、有序性及原子性问题,不过synchronized是一个比较重量级的操作(但是jdk1.6以后做了优化),对系统的性能有比较大的影响,所以,如果有其他解决方案,我们通常都避免使用synchronized来解决问题
阅读全文
摘要:线程的状态 Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态)。 New:新建状态,当线程创建完成时为新建状态,即new Thread(…),还没有调用start方法时,线程处于新建状态。 R
阅读全文
摘要:Synchronized的基本使用 Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。 Synchronized的作用主要有三个: 确保线程互斥的访问同步代码 保证共享变量的修改能够及时可见 有效解决重排序问题 从语法上讲,Synchronized总共有三种用
阅读全文
摘要:对于互联网公司,线上CPU飙升的问题很常见(例如某个活动开始,流量突然飙升时),按照本文的步骤排查,基本1分钟即可搞定! 问题复现 线上系统突然运行缓慢,CPU飙升,甚至到100%,以及Full GC次数过多,接着就是各种报警:例如接口超时报警等。此时急需快速线上排查问题。 问题排查 不管什么问题,
阅读全文
摘要:存储引擎的比较 注:上面提到的B树索引并没有指出是B-Tree和B+Tree索引,但是B-树和B+树的定义是有区别的。 在 MySQL 中,主要有四种类型的索引,分别为:B-Tree 索引, Hash 索引, Fulltext 索引和 R-Tree 索引。 B-Tree 索引是 MySQL 数据库中
阅读全文