11 2021 档案
摘要:多线程技术是服务端开发人员必须掌握的技术。线程的创建和销毁,都涉及到系统调用,比较消耗系统资源,所以就引入了线程池技术,避免频繁的线程创建和销毁。在Java中有一个Executors工具类,可以为我们创建一个线程池,其本质就是new了一个ThreadPoolExecutor对象。 线程池创建 先看一
阅读全文
摘要:#{}和${}的区别是什么? 答:${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql.jdbc.Driver。 #{}是sql的参数占位符,Mybatis会将sql中的#{}替换为?号,在sql执
阅读全文
摘要:TCP 要说http就绕不开tcp,TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性。但是,http是基于tcp协议的。 TCP/IP 协议分层模型 物理层将二进制的0、1和电压高低,光的闪灭和电波的强弱信号进行转换 链路层代表驱动 网络层 使用 IP 协议,IP 协
阅读全文
摘要:当程序使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、链接、初始化三个步骤对该类进行类加载。 类的加载、链接和初始化 类的加载 类加载指的是将类的class文件读入内存,并为之创建一个java.lang.Class对象。类的加载过程是由类加载器来完成,类加载器由JVM提供。我们开发人员
阅读全文
摘要:停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作。 在java中有以下3种方法可以终止正在运行的线程: ① 使线程正常退出,也就是当run方法完成后线程终止。 ② 使用stop方法强行终止,但是不推荐这个方法,因为stop和suspend及resume一样都是过期作废的方
阅读全文
摘要:线程之间通信的方式: ① 同步 ② while轮询的方式 ③ wait/notify机制 ④ 管道通信 同步 多个线程通过synchronized关键字持有同一个对象实现线程间的通信。本质上就是“共享内存”式的通信。多个线程需要访问同一个共享变量,谁拿到了锁(获得了访问权限),谁就可以执行。 whi
阅读全文
摘要:为什么要拆分数据库? 取决于数据库的负载和数据量。 单体项目在构建之初,数据库的负载和数据量都不大,所以不需要对数据库做拆分,小型财务系统、文书系统、ERP系统、OA系统,用一个MySQL数据库实例基本就够用了。 就像《淘宝技术这十年》里面说到的,电商业务的数据量增长飞快,所以最开始的PHP+MyS
阅读全文
摘要:联合索引失效的条件 联合索引又叫复合索引或组合索引。两个或更多个列上的索引被称作复合索引。 对于复合索引:MySQL从左到右的使用索引中的字段,一个查询可以只使用索引中的一部分,但只能是最左侧部分。例如索引是key index (a,b,c)。可以支持a | a,b | a,b,c 3种组合进行查找
阅读全文
摘要:Redis字符串的实现 Redis虽然是用C语言写的,但却没有直接用C语言的字符串,而是自己实现了一套字符串。目的就是为了提升速度,提升性能,可以看出Redis为了高性能也是煞费苦心。Redis构建了一个叫做简单动态字符串(Simple Dynamic String),简称SDS。 SDS 代码结构
阅读全文
摘要:哈希表(hash table)也叫散列表,是一种非常重要的数据结构,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表。 本文是基于JDK1.7的源码进行讲解,JDK8会有所不同,大致的变化: 1.7中采用数组+链表,1.8采用的是数组+链表/红黑树,即在1.7中链表长度
阅读全文
摘要:HashMap和HashTable的区别? HashMap 不是线程安全的 HashMap 是 map 接口的实现类,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap 允许 null key 和 null value,而 HashTable 不允许。 H
阅读全文
摘要:Dubbo是什么? Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,现已成为 Apache 基金会孵化项目。致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。 简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式
阅读全文
摘要:判断对象是否存活的算法包括: 引用计数算法 可达性分析算法 引用计数算法(Reference Counting) 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器加1;当引用失效时,计数器值减1;任何时刻计数器为0的对象就是不能再被引用的。 例如Object-C,Python语言使用引用计
阅读全文
摘要:MySQL查询字段区不区分大小写? 答案:不区分。 如何解决需要区分英文大小写的场景 解决方案一 MySQL默认的字符检索策略:utf8_general_ci,表示不区分大小写。可以使用utf8_general_cs,表示区分大小写,也可以使用utf8_bin,表示二进制比较,同样也区分大小写 。
阅读全文
摘要:单例模式介绍 单例模式(Singleton),是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个全局对象,这样有利于我们协调系统整体的行为。 比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,
阅读全文
摘要:同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别? 其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个
阅读全文
摘要:为什么需要消息队列 当系统中出现“生产“和“消费“的速度或稳定性等因素不一致的时候,就需要消息队列,作为抽象层,弥合双方的差异。“ 消息 ”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。消息被发送到队列中,“ 消息队列 ”是在消息的传输过程中
阅读全文
摘要:Comparable Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较,则依赖compareTo方法的实现。 如果add进入一个Collection的对象想要Collec
阅读全文
摘要:我们都知道HashMap是线程不安全的,在多线程环境中不建议使用,但是其线程不安全主要体现在什么地方呢? jdk1.7中的HashMap 扩容造成死循环 根源在transfer函数。 在对table进行扩容到newTable后,需要将原来数据转移到newTable中,在转移元素的过程中,使用的是头插
阅读全文
摘要:Java序列化与反序列化是什么? Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程: 序列化:对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文
阅读全文
摘要:ArrayList 和 LinkedList 是 Java 集合框架中用来存储对象引用列表的两个类。ArrayList 和 LinkedList 都实现 List 接口。先对List接口做一个简单的了解: 列表(list)是元素的有序集合,也称为序列。它提供了基于元素位置的操作,有助于快速访问、添加
阅读全文
摘要:JDK1.7HashMap采用的是数据结构是:数组 + 链表 JDK1.8则采用的是:数组 + 链表 + 红黑树 在Java 8 之前,HashMap和其他基于map的类都是通过链地址法解决冲突,它们使用单向链表来存储相同索引值的元素。在最坏的情况下,这种方式会将HashMap的get方法的性能从O
阅读全文
摘要:创建线程有几种不同的方式?你喜欢哪一种?为什么? 有四种方式可以用来创建线程: 继承Thread类 实现Runnable接口(实现Callable接口,主要解决返回值问题) 创建线程池(Executor框架或自定义线程池) 实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在
阅读全文
摘要:两者的定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和
阅读全文
posted @ 2021-11-28 09:54
残城碎梦
摘要:在日常开发中,我们使用 Redis 存储 key 时通常会设置一个过期时间,但是 Redis 是怎么删除过期的 key,而且 Redis 是单线程的,删除 key 会不会造成阻塞。要搞清楚这些,就要了解 Redis 的过期策略和内存淘汰机制。 Redis采用的是定期删除 + 懒惰删除策略。 定期删除
阅读全文
摘要:单点登录在现在的系统架构中广泛存在,它将多个子系统的认证体系打通,实现了一个入口多处使用,而在架构单点登录时,也会遇到一些小问题,在不同的应用环境中可以采用不同的单点登录实现方案来满足需求。 共享Session 共享Session可谓是实现单点登录最直接、最简单的方式。将用户认证信息保存于Sessi
阅读全文
摘要:怎么实现承载更多用户量的系统,通常来讲分为两个大方向,互相配合实现。 硬件架构改进,主要是使用阿里云这种多组件的云环境:通过负载均衡SLB,模版克隆的云服务器ECS,云数据库RDS,共享对象存储OSS等不同职责的云产品组合实现。 软件架构优化,主要是软件代码开发的规范:业务解耦合,架构微服务,单机无
阅读全文
摘要:什么是缓存雪崩?怎么解决? 缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是,缓存击穿指并发查同一条数据。 如何解决呢? 对缓存做高可用,防止缓存宕机。 使用断路器,如果缓存宕机,为了防止系统全部宕机,限制部分流量进入DB,保证部分可用,
阅读全文
摘要:equals() 的作用是用来判断两个对象是否相等。hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。 先祭一张图,可以思考一下为什么? 我们以“类的用途”来将“hashCode() 和 equals()的关系”分
阅读全文
摘要:Java语言是一种单继承结构语言,Java中所有的类都有一个共同的祖先。这个祖先就是Object类。如果一个类没有用extends明确指出继承于某个类,那么它默认继承Object类。 Object类是Java中所有类的基类。位于java.lang包中,一共有13个方法。如下图: Object():O
阅读全文
摘要:分布式锁常见的三种实现方式: 数据库乐观锁; 基于Redis的分布式锁; 基于ZooKeeper的分布式锁。 Redis要实现分布式锁,以下条件应该得到满足: 互斥性:在任意时刻,只有一个客户端能持有锁。 不能死锁:客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。 容错性:只要
阅读全文
摘要:懒汉模式 懒汉模式是变种最多的单例模式。 所谓懒汉即先不初始化单例,等第一次使用的时候再初始化,即“懒加载”。 基础的懒汉 // 饱汉 // UnThreadSafe public class Singleton1 { private static Singleton1 singleton = nu
阅读全文
摘要:保证消息是有顺序的,这是生产系统中常见的问题。 面试题剖析 举个例子,我们以前做过一个 mysql binlog 同步的系统,压力还是非常大的,日同步数据要达到上亿,就是说数据从一个 mysql 库原封不动地同步到另一个 mysql 库里面去(mysql -> mysql)。常见的一点在于说比如大数
阅读全文
摘要:分库分表后需要一个全局唯一的 id 来支持。 基于数据库的实现方案 数据库自增id 系统里每次需要得到一个 id的时候,都是往一个库的一个表里插入一条没任何业务含义的数据,获取到一个数据库自增的一个 id。拿到这个 id 之后再往对应的分库分表里去写入。 这个方案的好处就是方便简单,谁都会用;缺点就
阅读全文
摘要:TreeMap<K,V>的Key值是要求实现java.lang.Comparable,所以迭代的时候TreeMap默认是按照Key值升序排序的;TreeMap的实现是基于红黑树结构。适用于按自然顺序或自定义顺序遍历键(key)。 TreeMap中默认是按照升序进行排序的,如果想要降序,需要通过自定义
阅读全文
摘要:首先简单说一下(以下为一个回答的参考模板) (1) 实例化一个Bean -- 也就是我们常说的new; (2) 按照Spring上下文对实例化的Bean进行配置 -- 也就是IOC注入; (3) 如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(Stri
阅读全文
摘要:首先对mysql锁进行划分: 按照锁的粒度划分:行锁、表锁、页锁 按照锁的使用方式划分:共享锁、排它锁(悲观锁的一种实现) 还有两种思想上的锁:悲观锁、乐观锁。 InnoDB中有几种行级锁类型:Record Lock、Gap Lock、Next-key Lock Record Lock:在索引记录上
阅读全文
摘要:事务的四大特性 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。 一致性(Consistency):事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数
阅读全文
摘要:事务的并发问题 脏读(Dirty read):当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。 丢失修
阅读全文
摘要:java启动参数共分为三类 标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容; 非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容; 非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使
阅读全文
摘要:Heap Dump概述 Heap dump文件是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况。Heap dump文件是指定时刻的Java堆栈的快照,是一种镜像文件。Heap dump一般都包含了一个堆中的Java Objects, Class等基本信息。同时,当你在执行一个转储操作时,往往
阅读全文
摘要:配置完环境变量source之后,linux的ls vi命令均失效,报错如下: 解决方案: 1、输入 export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin并进行source 来确保命令暂时使用 export PATH=/usr/bin:/us
阅读全文
摘要:类加载子系统的作用 类加载子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识即16进制CA FE BA BE。 加载后的Class类信息存放于一块成为方法区的内存空间。除了类信息之外,方法区还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量
阅读全文
摘要:Java对象的创建 几乎所以对象都在JVM的堆中创建,通过类加载器加载进内存,并检查,然后分配内存,开始类的属性初始化赋值,设置对象头信息,通过构造方法创建对象。 一个简单的创建对象语句Clazz instance = new Clazz();包含的主要过程包括了类加载检查、对象分配内存、并发处理、
阅读全文
摘要:哪些内存需要回收 我们都知道JVM的内存结构包括五大区域:程序计数器、虚拟机栈、本地方法栈、堆区、方法区。 其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭,因此这几个区域的内存分配和回收都具备确定性,就不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。
阅读全文
摘要:运行时数据区是jvm中最为重要的部分。也是我们在调优时需要重点关注的区域。 根据《Java虚拟机规范》中的规定,在运行时数据区将内存分为方法区(Method Area)、Java堆区(JavaHeap)、Java虚拟机栈(Java Virtual Machine Stack)、程序计数器(Progr
阅读全文
摘要:用记事本写第一个java程序HelloWorld 第一步:写java源代码程序:HelloWorld.java 第二步:编译java源代码程序,生成HelloWorld.class文件,字节码文件 第三步:运行程序.(在JVM里运行的) 关于JVM,其实有很多大厂开发了不同版本的JVM,比较知名的有
阅读全文
摘要:Java 性能诊断工具简介 在 Java 的世界里,有许多诊断工具可供选择,既包括像 jmap、jstat 这样的简单命令行工具,又包括 JVisualvm、JProfiler 等图形化综合诊断工具,同时还有 SkyWalking、ARMS 这样的针对分布式应用的性能监控系统。 简单命令行工具 JD
阅读全文
摘要:FactoryBean是什么 FactoryBean是Spring提供的一个接口,通过实现这个接口可以定制实例化bean。 public interface FactoryBean<T> { //返回的对象实例 T getObject() throws Exception; //Bean的类型 Cl
阅读全文
摘要:1、java.lang.NoSuchFieldError报错解决方案 该问题字面意思,没有找到相应的字段。出现这种问题大多数是因为依赖冲突。 比如spring-data-redis会依赖spring-context-support,而我们创建的Spring项目也会引入spring-context-s
阅读全文
摘要:通过Resource接口获取资源 Resource接口的实现类有: Resource接口继承了InputStreamSource 接口,InputStreamSource 接口中有一个方法:getInputStream(),所以汇总起来,Resource接口中共有以下方法: public class
阅读全文
摘要:Spring的缓存机制 Spring的缓存不是一种具体的缓存实现方案,它底层需要依赖EhCache、Guava等具体的缓存工具。应用程序只要面向Spring缓存API编程,应用底层的缓存实现可以在不同的缓存之间自由切换,应用程序无须任何改变,只需要对配置略作修改即可。 启用Spring缓存 (1)
阅读全文
摘要:
jmeter安装 jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单。因为jmeter是java开发的,所以运行的时候必须先要安装jdk才可以。jmeter是免安装的,拿到安装包之后直接解压就可以使用,同时它在
阅读全文
jmeter安装 jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单。因为jmeter是java开发的,所以运行的时候必须先要安装jdk才可以。jmeter是免安装的,拿到安装包之后直接解压就可以使用,同时它在
阅读全文
摘要:RocketMQ是由阿里捐赠给Apache的一款低延迟、高并发、高可用、高可靠的分布式消息中间件。经历了淘宝双十一的洗礼。RocketMQ既可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性。 RocketMQ特性 参考了JMS规范,但有些
阅读全文

浙公网安备 33010602011771号