Java基础知识记录-20220313

Java基本类型

四类八种(byte 、 short、int、long、boolean、char、double、float )

Java内存模型

Java堆、Java虚拟机栈、本地方法栈、方法区(元空间)、程序计数器
线程共享的区域:Java堆、方法区(元空间)
线程私有的区域:Java虚拟机栈、本地方法栈、程序计数器

Java对象的序列化和反序列化

Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程

Java对象的浅拷贝和深拷贝

浅拷贝:对象的属性值拷贝过去,如果该对象存在内置对象属性,则指向该内置对象
深拷贝:对象的属性值拷贝过去,如果该对象存在内置对象属性,则生成一个内置对象的拷贝,即完全拷贝

实现
浅拷贝:对其实现 Cloneable 接口,并且重写 clone() 方法(直接调用Object的clone方法)
深拷贝:对其实现 Cloneable 接口,并且重写 clone() 方法,每个属性都要拷贝

内存溢出和内存泄漏的区别

内存溢出(Out Of Memory) :就是申请内存时,JVM没有足够的内存空间
内存泄露 (Memory Leak):就是申请了内存,但是没有释放,导致内存空间浪费

内存溢出的情况:
不停的创建对象

死锁

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。

产生死锁的四个必要条件
互斥条件:一个资源每次只能被一个进程使用。
请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

解决死锁
多线程获取锁的顺序要一致

检测死锁
jstack Pid

公平锁和非公平锁

公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。

优点:所有的线程都能得到资源,不会饿死在队列中。
缺点:吞吐量会下降很多,队列里面除了第一个线程,其他的线程都会阻塞,cpu唤醒阻塞线程的开销会很大。

非公平锁:多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。

优点:可以减少CPU唤醒线程的开销,整体的吞吐效率会高点,CPU也不必取唤醒所有线程,会减少唤起线程的数量。
缺点:你们可能也发现了,这样可能导致队列中间的线程一直获取不到锁或者长时间获取不到锁,导致饿死。

mysql乐观锁

悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。

mysql 乐观锁实现,在表中增加version字段,每次更新数据时先获取当前数据的版本号,然后更新时当版本号相等时,将版本号+1,并更新相关记录

mysql悲观锁实现,使用 select * from xxx where xxx for update,此时查询正常,在当前事务执行更新操作时锁释放

线程池的创建方式

1.使用ThreadPoolExecutor创建线程池
2.使用Executors工具类创建线程池

ThreadLocal是做什么的

ThreadLocal,线程本地变量,使用ThreadLocal维护变量时,每个线程都会获得该线程独享的一份变量副本,不会相互干扰。

springcloud常用注解

@SpringBootApplication 启动类
@EnableDiscoveryClient Eureka客户端
@ComponentScan 包扫描
@Configuration 配置类 @Bean相关
@EnableAutoConfiguration 自动配置
@EnableTransactionManagement 事务管理器
@EnableAsync 开启异步执行
@LoadBalanced 客户端负载均衡,作用于RestTemplate

spring中事务如何使用

1.编程式事务
2.声明式事务,方法上加@Transaction注解

spring中事务的传播机制

四种有事务的配置
PROPAGATION_REQUIRED —— 支持当前事务,如果当前没有事务,则新建一个事务,这是最常见的选择,也是 Spring 默认的一个事务传播属性。

PROPAGATION_NESTED —— Nested的事务和它的父事务是相依的,它的提交是要等和它的父事务一块提交的。

PROPAGATION_MANDATORY —— 支持当前事务,如果当前没有事务,则抛出异常。
PROPAGATION_REQUIRES_NEW —— 新建事务,如果当前存在事务,把当前事务挂起。

三种非事务的配置
PROPAGATION_NOT_SUPPORTED —— 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER —— 以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_SUPPORTS —— 支持当前事务,如果当前没有事务,则以非事务方式执行。

spring bean的生命周期

https://juejin.cn/post/6844904065457979405

springboot自动装配

1.springboot的核心注解@SpringBootApplication看作是 @Configuration、@EnableAutoConfiguration、@ComponentScan 注解的集合
2.这三个注解的作用
@EnableAutoConfiguration:启用 SpringBoot 的自动配置机制
@Configuration:允许在上下文中注册额外的 bean 或导入其他配置类
@ComponentScan: 扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描启动类所在的包下所有的类 ,可以自定义不扫描某些 bean。
3.@EnableAutoConfiguration:实现自动装配的核心注解,实现实际是通过 AutoConfigurationImportSelector类
4.AutoConfigurationImportSelector 类实现了 ImportSelector接口,也就实现了这个接口中的 selectImports方法,该方法主要用于获取所有符合条件的类的全限定类名,这些类需要被加载到 IoC 容器中
5.获取需要自动装配的所有配置类,读取META-INF/spring.factories
6.你添加的starter中也有META-INF/spring.factories文件,通过条件注解匹配,将某些starter自动配置

posted @ 2022-03-14 00:19  crazy-zz5536  阅读(31)  评论(0编辑  收藏  举报