10.ThreadLocal
ThreadLocal介绍官方介绍从Java官方文档中描述:ThreadLocal类用来提供线程内部局部变量,这种变量在多线程环境下访问(通过get 和set 方法访问)时能保证各个线程的变量相对于独立于其他线程内的变量。ThreadLocal实例通常来说都是private static类型的,用于关联线程和线程上下文
可以得知ThreadLocal作用是:提供线程内部的局部变量,不同的线程之间不会相互干扰,这种变量在线程声明周期内其作用,减少同一个线程内多个函数或组件之间一些公共变量传递的复杂度
总结:
线程并发:在多线程并发的场景下
传递数据:可以通过ThreadLocal在统一线程,不同组件中传递公共变量
线程隔离:每个线程的变量都是独立的,不会相互影响
常用方法
ThreadLocal:创建TheradLocal对象
public void set(T value):设置当前线程绑定的局部变量
public T get():获取当前线程绑定的局部变量
public void remove():移除当前线程绑定的局部变量
ThreadLocal类与synchronized ...
平衡二叉树、B 树、B+树
平衡二叉树平衡二叉树是基于二分法的策略提高数据的查找速度的二叉树的数据结构
特点:
平衡二叉树是采用二分法思维把数据按规则组装成一个树型结构的数据,用这个树形结构的数据减少无关数据的检索,大大的提升了数据检索的速度;平衡二叉树的数据结构组装过程有以下规则:
非叶子节点只能允许最多两个子节点存在
每一个非叶子检点数据分布规则按照左边的子节点小于当前节点的值,右边的子节点大于当前节点的值(这里的值是基于自己的算法规则而定的,比如hash值)
平衡树的层级结构:因为平衡二叉树查询性能和树的层级(h高度)成反比,h值越小查询越快、为了保证树的结构左右两端数据大致平衡降低二叉树的查询难度一般会采用一种算法机制实现节点数据结构的平衡,实现了这种算法的有比如Treap、红黑树,使用平衡二叉树能保证数据的左右两边的节点层级相差不会大于1.,通过这样避免树形结构由于删除增加变成线性链表影响查询效率,保证数据平衡的情况下查找数据的速度近于二分法查找;
总结平衡二叉树特点:
非叶子节点最多拥有两个子节点
非叶子节点大于左边子节点,小于右边子节点
树的左右两边的层级数相差不会大于1
没有值相等重复的 ...
如何保证消息队列的可靠性传输
RabbitMQ如何保证消息队列的可靠性传输
生产者弄丢数据生产者将数据发送到RabbitMQ的时候,可能数据就在半路丢失。此时RabbitMQ提供事务功能,就是生产者发送数据之前开启RabbitMQ事务channel.txSelect,然后发送消息,如果消息没有成功被RabbitMQ接受到,那么生产者就会异常报错,此时回滚事务channel.txRollback,然后重发消息,如果收到消息就可以提交事务channel.txCommit
123456789101112// 开启事务channel.txSelecttry { // 这里发送消息} catch (Exception e) { channel.txRollback // 这里再次重发这条消息}// 提交事务channel.txCommit
但是问题是,RabbitMQ 事务机制(同步)一搞,基本上吞吐量会下来,因为太耗性能。
所以一般来说,如果你要确保说写 RabbitMQ 的消息别丢,可以开启 confirm 模式,在生产者那里设置开启 confirm 模式之后, ...
9.synchronized、Lock、volatile
概述java的内存模型
每个线程都有自己的本地内存空间(java栈中的帧),线程执行时,先把变量从内存读到线程自己的本地内存空间,然后对变量进行操作
对该变量操作完成后,在某个时间再把变量刷新回主内存
锁提供的两种特性:互斥(mutual exclusion) 和可见性(visibility)
互斥:互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样一次只有一个线程能够使用该共享数据
可见性:简单来说就是一个线程修改了变量,其他线程可以立即知道。保证可见性的方法:volatile,synchronized,final(一旦初始化完成其他线程就可见)
volatilevolatile 是类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。确保本条指令不会因编译期的优化而省略,且要求每次直接读值。
简单概述volatile,它能够使变量在值发生改变时能尽快的让其他线程知道
问题来源编译器为了加快程序运行的速度,对一些变量的写操作会先在寄存器或者是CPU缓存上进行,最后才写入内存。而在这个过程中,变量的 ...
3.HashMap、ConcurrentHashMap、HashTable
HashMap、ConcurrentHashMap、HashTable的区别HashMap vs ConcurrentHashMap引入ConcurrentHashMap是为了同步集合HashTable之间有更好的选择,HashTable与HashMap,ConcurrentHashMap主要区别于HashMap不是同步的,线程不安全的和不适合应用于多线程并发环境下,而ConcurrentHashMap是线程安全的集合容器,特别是在多线程和并发环境中,通常作为Map的主要实现。
HashMap与ConcurrentHashMap的区别
ConcurrentHashMap是线程安全的并发环境下不需要额外的同步。虽然它不像Hashtable那样需要同样的同步等级(全表锁),但也有很多实际的用途
你可以使用Collections.synchronizedMap(HashMap)来包装HashMap作为同步容器,这时它的作用与hashtable一样,当每次对Map做修改操作的时候都会锁住这个Map对象,而ConcurrentHashMap会基于并发的等级来划分整个Map来达到线程安全,它之后锁 ...
2.Java集合
集合容器概述什么是集合
集合就是一个放数据的容器,准确的说是放数据对象引用的容器
集合类存放的都是对象的引用,而不是对象的本身
集合类型主要有三种: set(集)、list(列表) 和 map(映射)
集合的特点
集合用于存储对象的容器,对象是用来封装数据,对象多了也需要存储集中式管理
和数组对比对象的大小是不确定的,集合的长度是可变的,数组需要提前定义大小
集合和数组的区别
数组是 固定长度的,集合可变长度的
数组可以存储基本数据类型,也可以存储引用数据类型,集合只能存储引用数据类型
数组存储的元素必须是同一个数据类型,集合存储的对象可以是不同数据类型
使用集合框架的好处
容量自增长
提供了高性能的数据结构和算法,使编码更轻松,提高了程序速度和质量
可以方便的扩展或改写集合,提高代码复用性和可操作性
通过使用JDK自带的集合类,降低代码维护和学习新API成本
常用的集合类有哪些
Map接口和Collection接口是所有集合框架的父接口
Collection接口的子接口包括:Set接口和List接口
Map接口的实现类主要包括:HashMap、TreeMap、Hashta ...
04.Spring-Bean
Bean的作用域一般情况下,我们书写在IOC容器中的配置信息,会在我们的IOC容器运行时被创建,这就导致我们通过IOC容器获取到bean对象的时候,往往都是获取到了单例的Bean对象。
这样就意味着无论我们使用多少个 getBean()方法,获取到的同一个 JavaBean 都是同一个对象,这就是单实例 Bean,整个项目都会共享这一个 bean 对象。
在 Spring 中,可以在元素的 scope 属性里设置 bean 的作用域,以决定这个 bean 是单实例的还是多实例的。
Spring 框架支持以下五个作用域,分别为 singleton、prototype、request、session 和 global session,5种作用域说明:
singleton:在spring IOC容器仅存在一个Bean实例,Bean以单例方式存在,默认值
prototype:每次从容器中调用Bean时,都会返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean()
request:每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplication ...
03.Spring-AOP
关于AOP面向切面编程(Aspect-oriented Programming,俗称AOP)提供了一种面向对象编程(Object-oriented Programming,俗称OOP)的补充,面向对象编程最核心的单元是类(class),然而面向切面编程最核心的单元是切面(Aspects)。与面向对象的顺序流程不同,AOP采用的是横向切面的方式,注入与主业务流程无关的功能,例如事务管理和日志管理。
Spring的一个关键组件是AOP框架。 虽然Spring IoC容器不依赖于AOP(意味着你不需要在IOC中依赖AOP),但AOP为Spring IoC提供了非常强大的中间件解决方案。
AOP 是一种编程范式,最早由 AOP 联盟的组织提出的,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。它是 OOP的延续。利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率
我们之间的开发流程都是使用顺序流程,那么使用 AOP 之后,你就可以横向抽取重复代码,什么叫横向抽取呢?或许下面这幅图你能理解,先来看一下 ...
02.Spring-IoC
IoC是什么Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下:
谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
用图例说明一下,传统程序设计如图1-1,都是主动去创建 ...
01.SpringBoot常用的注解
前言:SpringMVC的层:Dao、Service、Controller、View的关系
Dao层: 负责数据持久化,与数据库进行联络的任务都封装在其中,Dao层的数据源以及相关的数据库连接参数都在Spring配置文件中进行配置。Dao接口中的方法都大同小异,因为对数据库的基本操作类似:insert、delete、update、select。在Dao层定义的一些方法,在Service层并没有被使用的情况。Dao层的操作经过抽象后基本都是通用的,在Dao层完成相关的定义,有利于后期的Service层的扩展
Service层: 建立在Dao层之上,Controller层之下。调用Dao的接口(Mapper.java),为Controller层提供接口。负责业务模块的逻辑应用设计,首先设计接口,在设计其实现的类。
Controller层: 负责具体业务模块流程的控制,即调用Service层的接口来控制业务流程。负责url映射(action)
View层:表示层,负责前端jsp页面表示。
面向接口编程,表示层调用控制层,控制层调用业务层,业务层调用数据访问层。Dao层设计与设计的数据库表 ...