学习笔记
文章平均质量分 55
Vigoss1996
这个作者很懒,什么都没留下…
展开
-
并发编程实战-安全性、活跃性以及性能问题
安全性:数据竞争: 多个线程同时访问一个数据,并且至少有一个线程会写这个数据。竞态条件: 程序的执行结果依赖程序执行的顺序。也可以按照以下的方式理解竞态条件: 程序的执行依赖于某个状态变量,在判断满足条件的时候执行,但是在执行时其他变量同时修改了状态变量。if (状态变量 满足 执行条件) {执行操作}问题: 数据竞争一定会导致程序存在竞态条件吗?有没有什么相关性?活跃性:死锁:破坏造成死锁的条件,1,使用等待-通知机制的Allocator; 2主动释放占有的资源;3,按顺序获取资源。活原创 2021-02-08 15:02:18 · 140 阅读 · 0 评论 -
序列化
序列化和反序列化需要确保算法一致业务代码中涉及序列化时,很重要的一点是要确保序列化和反序列化的算法一致性。使用 RedisTemplate 来操作 Redis 进行数据缓存。因为相比于 Jedis,使用 Spring 提供的 RedisTemplate 操作 Redis,除了无需考虑连接池、更方便外,还可以与 Spring Cache 等其他组件无缝整合。如果使用 Spring Boot 的话,无需任何配置就可以直接使用。数据(包含 Key 和 Value)要保存到 Redis,需要经过序列化算法来序列化原创 2021-02-01 15:56:34 · 272 阅读 · 0 评论 -
文件IO
文件读写需要确保字符编码一致计算机中都是按照一定的规则将其以二进制保存的。这个规则就是字符集,字符集枚举了所有支持的字符映射成二进制的映射表。在处理文件读写的时候,如果是在字节层面进行操作,那么不会涉及字符编码问题;而如果需要在字符层面进行读写的话,就需要明确字符的编码方式也就是字符集了。FileReader 是以当前机器的默认字符集来读取文件的如果希望指定字符集的话,需要直接使用 InputStreamReader 和 FileInputStream。使用 Files 类静态方法进行文件操作注意释原创 2021-01-25 13:48:10 · 77 阅读 · 0 评论 -
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 · 1589 阅读 · 0 评论 -
Java业务开发常见错误100例--异常处理
捕获和处理异常容易犯的错1、不在业务代码层面考虑异常处理,仅在框架层面粗犷捕获和处理异常。2、捕获了异常后直接生吞。3、丢弃异常的原始信息。4、抛出异常时不指定任何消息。捕获了异常打算处理的话,除了通过日志正确记录异常原始信息外,通常还有三种处理模式:转换,即转换新的异常抛出。对于新抛出的异常,最好具有特定的分类和明确的异常消息,而不是随便抛一个无关或没有任何信息的异常,并最好通过 cause 关联老异常。重试,即重试之前的操作。比如远程调用服务端过载超时的情况,盲目重试会让问题更严重,需要原创 2021-01-04 11:10:31 · 1147 阅读 · 0 评论 -
空值处理
NullPointerException 是 Java 代码中最常见的异常,最可能出现的场景归为以下 5 种:参数值是 Integer 等包装类型,使用时因为自动拆箱出现了空指针异常;字符串比较出现空指针异常;诸如 ConcurrentHashMap 这样的容器不支持 Key 和 Value 为 null,强行 put null 的 Key 或 Value 会出现空指针异常;A 对象包含了 B,在通过 A 对象的字段获得 B 之后,没有对字段判空就级联调用 B 的方法出现空指针异常;方法或远程服原创 2020-12-28 09:51:57 · 160 阅读 · 0 评论 -
集合类:坑满地的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 · 114 阅读 · 0 评论 -
创建对象时虚拟机做了什么
我们都知道,在语言层面上,创建对象通常仅仅是一个new关键字而已。但是在虚拟机中,对象的创建是怎样的一个过程呢?虚拟机在遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程(具体过程这里不做详解)。在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定。,为对象分配空间的任务等同于把一块确定大小的的内存从java堆里划分出来。假设j原创 2020-10-19 14:31:48 · 84 阅读 · 0 评论 -
JVM相关知识
内存的分配区间运行时数据区域包括程序计数器、java虚拟机栈、本地方法栈、java堆、方法区、运行时常量池。直接内存不属于运行时数据区域的一部分。程序计数器:线程私有的内存。当前线程所执行的字节码的行号指示器。虚拟机规范中唯一一个没有规定任何OutOfMemoryError情况的区域。java虚拟机栈:线程私有。人们常把内存分为堆和栈,这是很粗糙的不正确的方法,这里的栈就指虚拟机栈。虚拟机栈中有一个局部变量表,里面存放了编译器可知的各种基本数据类型(八个)、对象引用和returnAddress类型。原创 2020-10-12 10:40:33 · 59 阅读 · 0 评论 -
MyBatis 延迟加载
延迟加载:resultMap可实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能。在配置中添加select=“namespace+sql的Id” column=“关联的列名”。mybatis中使用延迟加载,需要先配置:<settings> <!--开启延迟加载--> <setting name="lazyLoadingEnabled" value="原创 2020-09-28 11:27:14 · 70 阅读 · 0 评论 -
反射机制
获取Class对象的三种方式:Object类的getClass()方法,因为所有类都继承自object类,所有都有一个getClass()方法来获取一个对象的运行时类。任何数据类型(包括基本数据类型)都有一个“静态的”class属性。通过Class类的静态方法:forName(String className)(常用)。三种方式常用第三种,第一种对象都有了还要反射干什么。第二种需要导入类的包,依赖太强,不导包就抛编译错误。一般都第三种,一个字符串可以传入也可写在配置文件中等多种方法方法的反射:原创 2020-09-21 14:51:01 · 63 阅读 · 0 评论 -
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 · 97 阅读 · 0 评论 -
kafka基础知识
Apache KafKa是分布式发布-订阅消息系统。最初由Linkedin公司开发,于2010年贡献给了Apache基金会并成为顶级开源项目。Kafka是一种快速、可扩展的、设计内在是分布式的、分区的和可复制的提交日志服务。Kafka不遵循JMS规范,并且依赖zookeeper。Kafka优点:高吞吐量、低延迟、可扩展性、持久性 (持久化到本地磁盘,并且支持数据备份防止数据丢失)、容错性、高并发。Kafka相关名称:搭建kafka集群步骤:每台服务器上安装jdk1.8环境,kafka高度依赖zoo原创 2020-08-31 10:17:30 · 102 阅读 · 0 评论 -
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 · 164 阅读 · 0 评论 -
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 · 798 阅读 · 0 评论 -
Hystrix实现断路器、服务降级、线程隔离
了解Hystrix之前首先需要明白几个概念,雪崩效应、断路器(熔断机制)、服务降级、线程隔离。雪崩效应:默认情况下,tomacat只有一个线程池去处理请求,这样在高并发的情况下大量的请求访问同一个服务器接口,线程池中所有的线程都用来处理访问这个接口的请求,就会导致请求全部堆积起来。这样其他接口有请求时也会阻塞,没有线程来处理,导致服务器崩溃。假设线程池有10个线程,每个线程每秒可以处理10个请求,一个接口有30000个请求,则需要处理五分钟。在这五分钟内如果有其他请求访问时,由于所有线程被占用,用户那边原创 2020-08-03 09:49:43 · 244 阅读 · 0 评论 -
rabbitmq的学习和使用
本周因上线原因,未学习微服务实战架构课程,且因为思特沃克的培训摸底作业中涉及消息通知,于是实现的过程中引入的rabbitmq消息队列,接下来写学习体会和使用情况rabbitmq简介AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。rabbi原创 2020-07-19 22:57:51 · 118 阅读 · 0 评论 -
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 · 598 阅读 · 0 评论 -
微服务实战架构:Apollo学习笔记
Apollo工作原理架构图:最核心的四部分(每部分基本都是集群):Client、Portal、ConfigService、AdminService。其中Portal、ConfigService、AdminService是apollo启动服务时启动的进程,如果有多个环境,则启动一个Portal进程,启动多个ConfigService、AdminService进程。其中Portal是配置管理页面,当配置文件进行修改之后,通过AdminService将修改后的文件写入数据库。ConfigService把数据原创 2020-07-05 12:44:04 · 623 阅读 · 0 评论