![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java基础
文章平均质量分 85
后端技术那点事
这个作者很懒,什么都没留下…
展开
-
Mybatis如何解决循环依赖问题
mybatis的循环依赖,即是mapper.xml里面的A查询的resultMap包含了B属性(B属性是通过子查询得到的),而B属性中又包含了A(B查询的resultMap中又包含了A的查询),就会造成A-B-A的情况。原创 2023-06-25 14:49:17 · 1118 阅读 · 0 评论 -
生产项目中基于springboot项目解决循环依赖的三种方式
在生产项目中,可以使用Spring Boot框架来快速开发Spring应用程序。Spring Boot提供了一种方便的方式来创建独立的,基于Spring的应用程序,并且有着高度的自动化配置和开箱即用的特性。可以使用@Lazy注解来控制Bean的延迟初始化,同时可以使用AOP切面编程来解决循环依赖问题。原创 2023-06-25 14:44:32 · 1633 阅读 · 0 评论 -
Java基础从入门到精通系列(一)
Java基础系列原创 2023-04-16 22:17:12 · 1373 阅读 · 1 评论 -
SpringSecurity的使用以及集成JWT、OAuth2.0实现单点登录
SpringSecurity 框架的介绍以及使用、配合JWT实现分布式权限方案原创 2022-07-08 23:27:41 · 2146 阅读 · 2 评论 -
JUC系列(五)
1、ThreadLocal1.1、什么是ThreadLocal线程局部变量。1.2、ThreadLocal的作用以及可以为什么保证线程安全?多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种规避多线程访问出现线程不安全的方法,当我们在创建一个变量后,每一个线程在访问ThreadLocal实例的时候,都有自己的、独立初始原创 2022-04-05 18:18:21 · 1035 阅读 · 0 评论 -
JUC系列(四)
1、CAS1.1、没有CAS之前,保证线程安全的方式多线程环境不使用原子类保证线程安全(基本数据类型)public class T3{ volatile int number = 0; //读取 public int getNumber() { return number; } //写入加锁保证原子性 public synchronized void setNumber() { number++;原创 2022-04-04 23:39:51 · 569 阅读 · 1 评论 -
JUC系列(三)
1、Java内存模型1.1、什么是Java内存模型JMM?JMM(Java内存模型Java Memory Model,简称JMM)本身是一种抽象的概念并不真实存在,它仅仅描述的是一组约定或规范,通过这组规范定义了程序中(尤其是多线程)各个变量(包括实例字段,静态字段和构成数组对象的元素)的读写访问方式。JMM关于同步的规定:线程解锁前,必须把共享变量的值刷新回主内存线程加锁前,必须读取主内存的最新值,到自己的工作内存加锁和解锁是同一把锁JMM规范有三大特性:可见性:可见性是指当一个线程原创 2022-04-02 16:17:51 · 1598 阅读 · 0 评论 -
JUC系列(二)
1、聊一聊Java“锁”1.1、乐观锁和悲观锁悲观锁:认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。synchronized关键字和Lock的实现类都是悲观锁。适合写操作多的场景,先加锁可以保证写操作时数据正确,显式的锁定之后再操作同步资源。乐观锁:乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入。如果数据原创 2022-03-30 21:22:50 · 698 阅读 · 0 评论 -
JUC系列(一)
1、为什么多线程极其重要? 多线程变得极其重要的原因从软硬件两个方面来说,首先硬件方面:主要是摩尔定律失效,它是由英特尔创始人之一Gordon Moore(戈登·摩尔)提出来的,其内容是当价格不变时,将每隔18个月,性能也将提升一倍(当价格不变时,集成电路上可容纳的元器件的数目约每隔18-24个月便会增加一倍,性能也将提升一倍,换言之,每一美元所能买到的电脑性能,将每隔18-24个月翻一倍以上,这一定律揭示了信息技术进步的速度),但是可是从2003年开始CPU主频已经不再翻倍,而是采用多核而不是更快的主原创 2022-03-28 14:33:30 · 1579 阅读 · 0 评论 -
VMware虚拟机安装以及IP配置
1、安装VMware-workstation-15VMware-workstation-15的下载地址1.1、双击安装文件1.2、更改路径到自己的安装目录1.3、安装完成输入许可证号2、VM上手动安装CentOS72.1、创建虚拟机选择虚拟机的存放路径配置CPU个数。根据电脑性能,配置给虚拟机的处理器(CPU)。物理CPU个数×每颗核数就等于逻辑CPU的个数。具体的配置根据自身电脑来进行选择。内存大小也是根据自己电脑进行配置。也是根据自己电脑进行原创 2021-05-30 11:06:49 · 2004 阅读 · 1 评论 -
HashMap、hashSet、HashTable、ConcurrentHashMap总结
1、HashMapHashMap 是存储key,value双列数据的集合。他的底层结构主要是 数组+ 链表+ 红黑树实现的 。HashMap中hash数组默认大小是16,增加的方式是 old*2。加载因子是0.75,是线程不安全的。当put一个节点数据时,会根据key进行一个hash操作,也就是说通过将key的hashcode值进行二进制转换得到一个32位的二进制数,然后再将key的hashcode无符号右移16位也得到一个32位的二进制数 ,将这两个32位的二进制数进行异或操作(相同为0不同为1)原创 2021-05-05 19:38:37 · 223 阅读 · 2 评论 -
Java中比较对象大小的两种实现方式
1、Comparable接口的使用(自然排序)实现Comparable并从重写compareTo()方法重写compareTo()的规则:如果当前对象this大于形参对象obj,则返回正整数,如果当前对象this小于形参对象obj,则返回负整数。如果当前对象this等于形参对象obj,则返回零。像String 、包装类等实现了Comparable接口,重写了compareTo()方法,给出了比较两个对象大小的方法。public final class String implemen原创 2021-05-05 11:05:45 · 516 阅读 · 0 评论 -
ArrayList、LinkedList、Vector的源码分析
1、ArrayList底层是Object的动态数组构成的。jdk7:ArrayList的构造方法初始化会创建容器大小为10的Object数组。扩容方式是1.5倍扩容,如果扩容完之后,需要的容量大小还不够的话,会直接扩容到所需要的容量大小。jdk8ArrayList的构造方法初始化不会实例化数组容量大小。 /** * Constructs an empty list with an initial capacity of ten. */ public Arra原创 2021-05-05 00:00:29 · 99 阅读 · 0 评论 -
统一异常处理机制:
统一异常处理机制:1、使用SpringMVC提供的统一异常拦截器(BasicExceptionAdvice)package cn.leyou.common.exception;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.ControllerAdv...原创 2019-08-28 19:11:15 · 369 阅读 · 0 评论 -
hashMap和hashTable的区别以及HashMap的底层原理?
hashMap和hashTable的区别?1、继承的父类不同HashTable继承Dictionary类,而hashMap继承了AbstractMap类,但是二者都实现了map接口。2、线程安全性不同 Hashtable 线程安全,因为它每个方法中都加入了Synchronize。HashMap是线程不安全的。 HashMap底层是一个Entry数组,当发生hash冲突的时候,ha......原创 2019-09-24 09:01:18 · 11181 阅读 · 3 评论