自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 并发编程实战-安全性、活跃性以及性能问题

安全性:数据竞争: 多个线程同时访问一个数据,并且至少有一个线程会写这个数据。竞态条件: 程序的执行结果依赖程序执行的顺序。也可以按照以下的方式理解竞态条件: 程序的执行依赖于某个状态变量,在判断满足条件的时候执行,但是在执行时其他变量同时修改了状态变量。if (状态变量 满足 执行条件) {执行操作}问题: 数据竞争一定会导致程序存在竞态条件吗?有没有什么相关性?活跃性:死锁:破坏造成死锁的条件,1,使用等待-通知机制的Allocator; 2主动释放占有的资源;3,按顺序获取资源。活

2021-02-08 15:02:18 146

原创 序列化

序列化和反序列化需要确保算法一致业务代码中涉及序列化时,很重要的一点是要确保序列化和反序列化的算法一致性。使用 RedisTemplate 来操作 Redis 进行数据缓存。因为相比于 Jedis,使用 Spring 提供的 RedisTemplate 操作 Redis,除了无需考虑连接池、更方便外,还可以与 Spring Cache 等其他组件无缝整合。如果使用 Spring Boot 的话,无需任何配置就可以直接使用。数据(包含 Key 和 Value)要保存到 Redis,需要经过序列化算法来序列化

2021-02-01 15:56:34 279

原创 文件IO

文件读写需要确保字符编码一致计算机中都是按照一定的规则将其以二进制保存的。这个规则就是字符集,字符集枚举了所有支持的字符映射成二进制的映射表。在处理文件读写的时候,如果是在字节层面进行操作,那么不会涉及字符编码问题;而如果需要在字符层面进行读写的话,就需要明确字符的编码方式也就是字符集了。FileReader 是以当前机器的默认字符集来读取文件的如果希望指定字符集的话,需要直接使用 InputStreamReader 和 FileInputStream。使用 Files 类静态方法进行文件操作注意释

2021-01-25 13:48:10 103

原创 Java业务开发常见错误100例--日志

Logback、Log4j、Log4j2、commons-logging、JDK 自带的 java.util.logging 等,都是 Java 体系的日志框架,确实非常多。而不同的类库,还可能选择使用不同的日志框架。这样一来,日志的统一管理就变得非常困难。为了解决这个问题,就有了 SLF4J(Simple Logging Facade For Java),如下图所示:SLF4J 实现了三种功能:一是提供了统一的日志门面 API,即图中紫色部分,实现了中立的日志记录 API。二是桥接功能,即图中蓝

2021-01-11 09:56:12 1820

原创 Java业务开发常见错误100例--异常处理

捕获和处理异常容易犯的错1、不在业务代码层面考虑异常处理,仅在框架层面粗犷捕获和处理异常。2、捕获了异常后直接生吞。3、丢弃异常的原始信息。4、抛出异常时不指定任何消息。捕获了异常打算处理的话,除了通过日志正确记录异常原始信息外,通常还有三种处理模式:转换,即转换新的异常抛出。对于新抛出的异常,最好具有特定的分类和明确的异常消息,而不是随便抛一个无关或没有任何信息的异常,并最好通过 cause 关联老异常。重试,即重试之前的操作。比如远程调用服务端过载超时的情况,盲目重试会让问题更严重,需要

2021-01-04 11:10:31 1265

原创 空值处理

NullPointerException 是 Java 代码中最常见的异常,最可能出现的场景归为以下 5 种:参数值是 Integer 等包装类型,使用时因为自动拆箱出现了空指针异常;字符串比较出现空指针异常;诸如 ConcurrentHashMap 这样的容器不支持 Key 和 Value 为 null,强行 put null 的 Key 或 Value 会出现空指针异常;A 对象包含了 B,在通过 A 对象的字段获得 B 之后,没有对字段判空就级联调用 B 的方法出现空指针异常;方法或远程服

2020-12-28 09:51:57 171

原创 集合类:坑满地的List列表操作

使用 Arrays.asList 把数据转换为 List 的三个坑1、不能直接使用 Arrays.asList 来转换基本类型数组。2、Arrays.asList 返回的 List 不支持增删操作。3、对原始数组的修改会影响到我们获得的那个 List。使用 List.subList 进行切片操作居然会导致 OOM?出现 OOM 的原因是,subList 方法返回的 List 强引用。修复方式有两种:一种是,不直接使用 subList 方法返回的 SubList,而是重新使用 new Array

2020-12-21 14:11:41 141

原创 数值计算

浮点数运算避坑第一原则:使用 BigDecimal 表示和计算浮点数,且务必使用字符串的构造方法来初始化 BigDecimal浮点数避坑第二原则:浮点数的字符串格式化也要通过 BigDecimal 进行。BigDecimal 的 equals 方法 比较的是 BigDecimal 的 value 和 scale,1.0 的 scale 是 1,1 的 scale 是 0,所以结果一定是 false:只比较 BigDecimal 的 value,可以使用 compareTo 方法。因为 BigDe

2020-12-07 15:54:53 123

原创 判等问题

首先,要注意 equals 和 = =的区别。业务代码中进行内容的比较,针对基本类型只能使用 = =,针对 Integer、String 在内的引用类型,需要使用 equals。Integer 和 String 的坑在于,使用 = = 判等有时也能获得正确结果。其次,对于自定义类型,如果类型需要参与判等,那么务必同时实现 equals 和 hashCode 方法,并确保逻辑一致。如果希望快速实现 equals、hashCode 方法,可以借助 IDE 的代码生成功能,或使用 Lombok 来生成。如果类型

2020-11-30 09:39:24 141

原创 数据库索引学习

InnoDB 是如何存储数据的?虽然数据保存在磁盘中,但其处理是在内存中进行的。为了减少磁盘随机读取次数,InnoDB 采用页而不是行的粒度来保存数据,即数据被分成若干页,以页为单位保存在磁盘中。InnoDB 的页大小,一般是 16KB。各个数据页组成一个双向链表,每个数据页中的记录按照主键顺序组成单向链表;每一个数据页中有一个页目录,方便按照主键查询记录。B+ 树的特点包括:最底层的节点叫作叶子节点,用来存放数据;其他上层节点叫作非叶子节点,仅用来存放目录项,作为索引;非叶子节点分为不同层次

2020-11-23 11:30:22 90

原创 Spring声明式事务

java开发常见错误 Spring声名式事务@Transactional 生效原则1,除非特殊配置(比如使用 AspectJ 静态织入实现 AOP),否则只有定义在 public 方法上的 @Transactional 才能生效。原因是,Spring 默认通过动态代理的方式实现 AOP,对目标方法进行增强,private 方法无法代理到,Spring 自然也无法动态增强事务处理逻辑。2,必须通过代理过的类从外部调用目标方法才能生效。事务处理易错总结第一,因为配置不正确,导致方法上的事务没生效。

2020-11-16 14:31:56 313

原创 HTTP 调用最常遇到的超时、重试和并发问题

对于 HTTP 调用,虽然应用层走的是 HTTP 协议,但网络层面始终是 TCP/IP 协议。TCP/IP 是面向连接的协议,在传输数据之前需要建立连接。几乎所有的网络框架都会提供这么两个超时参数:连接超时参数 ConnectTimeout,让用户配置建连阶段的最长等待时间;读取超时参数 ReadTimeout,用来控制从 Socket 上读取数据的最长等待时间。正确理解和配置这两个参数,对业务应用特别重要,毕竟超时不是单方面的事情,需要客户端和服务端对超时有一致的估计,协同配合方能平衡吞吐量和错误

2020-11-09 10:19:07 2840

原创 java业务开发常见错误:线程池

线程池的声明需要手动进行new ThreadPoolExecutor形式。生产中常因为使用Executors类下方法,如newFixedThreadPool和newCachedThreadPool导致OOM问题。newFixedThreadPool中虽然线程数可以限制,但任务数量是无限的,因为使用的是LinkendBlockingQueue无限队列来存储任务,任务不能及时处理,过多堆积,最终OOM;newCachedThreadPool线程数是无上界的,而工作队列是SynchronousQueue没有存

2020-10-26 15:10:19 604

原创 创建对象时虚拟机做了什么

我们都知道,在语言层面上,创建对象通常仅仅是一个new关键字而已。但是在虚拟机中,对象的创建是怎样的一个过程呢?虚拟机在遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程(具体过程这里不做详解)。在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定。,为对象分配空间的任务等同于把一块确定大小的的内存从java堆里划分出来。假设j

2020-10-19 14:31:48 107

原创 JVM相关知识

内存的分配区间运行时数据区域包括程序计数器、java虚拟机栈、本地方法栈、java堆、方法区、运行时常量池。直接内存不属于运行时数据区域的一部分。程序计数器:线程私有的内存。当前线程所执行的字节码的行号指示器。虚拟机规范中唯一一个没有规定任何OutOfMemoryError情况的区域。java虚拟机栈:线程私有。人们常把内存分为堆和栈,这是很粗糙的不正确的方法,这里的栈就指虚拟机栈。虚拟机栈中有一个局部变量表,里面存放了编译器可知的各种基本数据类型(八个)、对象引用和returnAddress类型。

2020-10-12 10:40:33 68

原创 MyBatis 延迟加载

延迟加载:resultMap可实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能。在配置中添加select=“namespace+sql的Id” column=“关联的列名”。mybatis中使用延迟加载,需要先配置:<settings> <!--开启延迟加载--> <setting name="lazyLoadingEnabled" value="

2020-09-28 11:27:14 97

原创 反射机制

获取Class对象的三种方式:Object类的getClass()方法,因为所有类都继承自object类,所有都有一个getClass()方法来获取一个对象的运行时类。任何数据类型(包括基本数据类型)都有一个“静态的”class属性。通过Class类的静态方法:forName(String className)(常用)。三种方式常用第三种,第一种对象都有了还要反射干什么。第二种需要导入类的包,依赖太强,不导包就抛编译错误。一般都第三种,一个字符串可以传入也可写在配置文件中等多种方法方法的反射:

2020-09-21 14:51:01 71

原创 Freemarker的使用

1.什么是FreemarkerFreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等。目前企业中:主要用Freemarker做静态页面或是页面展示2. Freemarker的使用方法把freemarker的jar包添加到工程中。Maven工程添加依赖<dependency> <g

2020-09-07 09:53:49 121

原创 kafka基础知识

Apache KafKa是分布式发布-订阅消息系统。最初由Linkedin公司开发,于2010年贡献给了Apache基金会并成为顶级开源项目。Kafka是一种快速、可扩展的、设计内在是分布式的、分区的和可复制的提交日志服务。Kafka不遵循JMS规范,并且依赖zookeeper。Kafka优点:高吞吐量、低延迟、可扩展性、持久性 (持久化到本地磁盘,并且支持数据备份防止数据丢失)、容错性、高并发。Kafka相关名称:搭建kafka集群步骤:每台服务器上安装jdk1.8环境,kafka高度依赖zoo

2020-08-31 10:17:30 110

原创 XML转对象,对象转XML的学习

上周学习了XML转对象,对象转XML的方法主要是使用了javax的包package com.xml; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; impor

2020-08-17 10:29:03 191

原创 Springboot项目war包增量部署的技术验证

上周学习了Springboot项目通过打war包方式部署在tomcat中,后续迭代通过添加class文件实现增量部署。下载Springboot项目通过阿里云https://start.aliyun.com生成一个简单Springboot项目,选择war包打包方式,并添加web依赖。由于选择的是war包的打包方式,生成的代码会多一个ServletInitializer类,它实现了SpringBootServletInitializer接口,用于tomcat调用使用。public class Serv

2020-08-10 09:58:12 825

原创 Hystrix实现断路器、服务降级、线程隔离

了解Hystrix之前首先需要明白几个概念,雪崩效应、断路器(熔断机制)、服务降级、线程隔离。雪崩效应:默认情况下,tomacat只有一个线程池去处理请求,这样在高并发的情况下大量的请求访问同一个服务器接口,线程池中所有的线程都用来处理访问这个接口的请求,就会导致请求全部堆积起来。这样其他接口有请求时也会阻塞,没有线程来处理,导致服务器崩溃。假设线程池有10个线程,每个线程每秒可以处理10个请求,一个接口有30000个请求,则需要处理五分钟。在这五分钟内如果有其他请求访问时,由于所有线程被占用,用户那边

2020-08-03 09:49:43 271

原创 学习笔记:策略模式

本周参加思特沃克的培训,作业中需要使用策略模式,对策略模式进行了学习。策略模式在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。介绍意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难

2020-07-26 21:55:35 144

原创 rabbitmq的学习和使用

本周因上线原因,未学习微服务实战架构课程,且因为思特沃克的培训摸底作业中涉及消息通知,于是实现的过程中引入的rabbitmq消息队列,接下来写学习体会和使用情况rabbitmq简介AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。rabbi

2020-07-19 22:57:51 129

原创 Apollo快速起步

一、准备工作二、安装步骤三、启动Apollo配置中心四、使用Apollo配置中心为了让大家更快的上手了解Apollo配置中心,我们这里准备了一个Quick Start,能够在几分钟内在本地环境部署、启动Apollo配置中心。考虑到Docker的便捷性,我们还提供了Quick Start的Docker版本,如果你对Docker比较熟悉的话,可以参考Apollo Quick Start Docker部署通过Docker快速部署Apollo。不过这里需要注意的是,Quick Start只针对本地测.

2020-07-13 14:45:45 636

原创 微服务实战架构:Apollo学习笔记

Apollo工作原理架构图:最核心的四部分(每部分基本都是集群):Client、Portal、ConfigService、AdminService。其中Portal、ConfigService、AdminService是apollo启动服务时启动的进程,如果有多个环境,则启动一个Portal进程,启动多个ConfigService、AdminService进程。其中Portal是配置管理页面,当配置文件进行修改之后,通过AdminService将修改后的文件写入数据库。ConfigService把数据

2020-07-05 12:44:04 665

空空如也

空空如也

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

TA关注的人

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