- 博客(32)
- 收藏
- 关注
原创 Spring学习
Spring中的设计模式 控制反转(原则) 依赖注入:实现控制反转的一种设计模式 将想要创建对象的类(Person.class)和其依赖交给容器,让容器帮你创建对象 工厂模式 创建bean对象 BeanFactory 延迟注入(使用到某个 bean 的时候才会注入) 占用内存少,程序启动速度快 ApplicationContext 容器启动时一次性创建所有bean 是BeanFactory的扩展 一般使用 实现类 ClassPathXmlApplication:
2021-03-26 18:00:06
404
原创 Kafka学习
Kafka 分布式流式处理平台 功能 消息队列:发布订阅模式+广播(消息发布后才订阅的消费者收不到该消息) producer consumer broker topic partition(分区) topic的一部分,一个topic可以有多个 可以分布在不同的broker上 可简单理解为消息队列中的队列 多副本机制,往leader写和读,follow从leader中获取信息进行同步,当leader发生故障时,follow通过选举成为新的leader(同步成度达到要求) 优点:负载均衡,可以指定副本
2021-03-26 17:57:10
225
原创 RocketMQ学习
RocketMQ 一个队列模型的中间件 优点:高性能、高可靠、高实时、分布式 RocketMQ 通过使用在一个 Topic 中配置多个队列并且每个队列维护每个消费者组的消费位置 实现了 主题模式/发布订阅模式 。 成员 Broker(中间件,与Topic多对多) 有多个,实现负载均衡 集群,主从部署(从节点可以提供消费服务,但是不能写入) NameServer(注册中心) Broker管理 路由信息管理 集群(没有主节点)、会出现数据不一致因为互不通信,当有新服务器加入的时候不会立
2021-03-26 15:14:01
264
原创 消息队列基础知识学习
优点 通过异步处理提高系统性能(减少响应所需时间)。 削峰/限流 降低系统耦合性。 缺点: 系统可用性降低 系统复杂性提高 一致性问题 JMS java的消息服务(API是一个消息服务的标准或者说是规范) 可以实现异步的消息传输 优点 使分布式的耦合度更低 消息服务更加可靠 异步性 ActiveMQ实现的基础 消息模式 点对点(P2P)模型 Queue作为载体 满足生产者和消费者模式 一条消息只能被一个消费者使用,未被消费的消息在队列中保留直到被消费或超时 ..
2021-03-18 22:59:38
195
原创 RabbitMQ
采用 Erlang 语言实现 AMQP的消息中间件 消息只能存储到队列里。一个消息可投入一个或多个队列。 多个消费者可以订阅同一个队列,这时队列中的消息会被平均分摊(Round-Robin,即轮询)给多个消费者进行处理。避免重复消费。 不支持队列层面的广播消费。 特点 可靠性:使用一些机制来保证消息的可靠性,如持久化、传输确认及发布确认等。 灵活的路由:对于典型的路由功能,RabbitMQ 己经提供了一些内置的交换器来实现。针对更复杂的路由功能,可以将多个交换器绑定在一起,也可以通过插件机制来实现自己的.
2021-03-18 22:58:10
259
原创 volatile、CAS、synchronized
volatile 特性: 保证可见性,不保证原子性 当写一个volatile变量时,JMM会把该线程本地内存中的变量强制刷新到主内存中去; 这个写会操作会导致其他线程中的volatile变量缓存无效。 保证顺序性:禁止指令重排 a.当程序执行到volatile变量的读操作或者写操作时,在其前面的操作的更改肯定全部已经进行,且结果已经对后面的操作可见;在其后面的操作肯定还没有进行; b.在进行指令优化时,不能将对volatile变量访问的语句放在其后面执行,也不能把volatile变量后面的语句
2021-03-18 22:11:07
238
原创 重入锁(ReentranLock)
表示该锁能够支持一个线程对资源的重复加锁 支持获取锁的时候的公平和非公平性选择 如果在绝对时间上,先对锁进行获取的请求一定先被满足,那么这个锁是公平的,反之则是不公平的。 ReentranLock提供了一个构造函数,能够控制锁是否是公平的。 公平锁机制往往没有非公平的效率高 公平锁能减少饥饿发生的概率 实现重进入 线程再次获取锁 锁的最终释放 实现: 线程获取锁的时候检查同步状态,如果为0尝试获取,如果不为0,判断持有锁的是不是当前线程,如果是增加同步状态 线程释放锁的时候减少同步状态,当同步状.
2021-03-18 22:08:16
202
原创 读写锁(ReadWriteLock)
读写锁拥有比排他锁更好的并发性和吞吐量 readLock() writeLock() 其他展示内部工作状态的方法 int getReadLockCount():返回当前读锁被获取的次数 int getReadHoldCount():返回当前线程获取读锁的次数 boolean isWriteLocked():判断写锁是否被获取 int getWriteHoldCount():返回当前写锁被获取的次数 读写状态设计 依赖自定义同步器来实现同步功能 在同步状态(一个整性变量)上维护多个读线程和一个写线程.
2021-03-18 21:26:51
255
原创 mysql基础知识
mysql 关系型数据库 默认端口号:3306 存储引擎 5.7 默认的存储引擎是InnoDB 具有事务、回滚和崩溃修复能力的事务安全型表 支持行级锁、表级锁 支持外键 支持MVCC 5.5及以前默认的存储引擎是MyISAM 不支持事物、行级锁 崩溃后无法安全恢复 性能极佳 索引 哈希索引 场景:绝大部分需求为单条记录查询 BTree索引 适合大部分场景 b+树 MyISAM(非聚簇索引) B+Tree叶节点的data域存放的是数据记录的地址 索引文件和数据文件是分离的
2021-03-11 22:42:04
223
1
转载 Java23种设计模式之创建型模式
学习自http://c.biancheng.net/view/8508.html 设计原则 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E8ZyTyxU-1615194675655)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20210308111154427.png)] 创建型模式 特点:将对象的创建与使用分离 单例模式 对象创建型模式 指一个类只有一个实例,且该类能自行创建这
2021-03-08 17:13:32
141
原创 AQS源码详解——独占锁(acquire、release)
acquire(int arg) 获取独占资源 public final void acquire(int arg) { //1、尝试获取独占资源 成功返回 失败进行下一步 // 2、生成节点,将其添加进同步队列 竞争成功返回 //3、若线程在不可中断的时候被中断了 if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXC
2021-03-02 17:32:14
439
原创 JVM_内存管理
自动内存管理 运行时数据区 线程独享 虚拟机栈(执行Java方法也就是字节码服务) 1、局部变量表 1)存放信息 ①基本数据类型(boolean、byte、char、short、int、float、long、double) ②对象引用 a.reference类型 b.不等同于对象本身 c.可
2021-02-22 18:30:42
187
原创 Deque 双端队列
Deque 双端队列 继承自Queue接口 实现类: 常用LinkedList实现。 常用方法有如下,以及Queue中的方法 第一个元素 (头部) 最后一个元素 (尾部) 抛出异常 特殊值 抛出异常 特殊值 插入 addFirst(e) offerFirst(e) addLast(e) offerLast(e) 删除 removeFirst() pollFirst() removeLast() pollLast() 检查 getFirst() peekFi
2021-02-21 22:27:00
166
原创 getOrDefault()
map.getOrDefault(Object key, V defaultValue) 当Map集合中有这个key时,就使用这个key对应的value值,如果没有就使用defaultValue
2021-02-21 22:23:18
342
原创 Java基础知识_内部类
1、内部类既可以访问自身数据域,也可以访问它的外围类对象的数据域 若有重名,优先调用内部类中定义的同名变量。 在其他类中,通过 外部类.内部类的形式进行访问 People.Compare compare = new Compare(); 2、内部类中所有静态域都必须是 final。 3、局部类不能用public或private访问符进行声明。与其他内部类相比,局部类还有一个优点。它们不仅能够访问包含它们的外部类,还可以访问局部变量。不过这些局部变量必须为事实上的final。 3、由于构造器的名字必须
2021-02-20 22:21:41
168
原创 Java基础知识_类、方法、面向对象
类 构造函数 和类名一致 可以进行重载 不可以重写 没有返回值 new 调用 如果没有自定义的构造函数,那么java会创建一个无参构造函数 super this(位于构造函数中有效代码的第一行) 隐式参数和显式参数 this 指向的是 谁调用这个方法就指向谁 public void setSex(int sexGet){ this.sex = sexGet; //此处的this即为下文中的对象s,是该函数的隐式参数 //sexGet为显示参数 } Student s
2021-02-20 22:09:37
137
原创 Java基础知识_基本类型的运用
整型 int 正负20亿() 拆箱和装箱 .valueOf();//装箱 .intValue();//拆箱 java编译器做的自动拆装箱 128陷阱[-128,127],高点可自行设置 (Integer使用较多,应用得当可节约内存) long 128陷阱[-128,127],边界不可更改 short byte 浮点型 float(转到int时可能会出现精度缺失) double 相乘时会出现精度缺失的情况,可先转为BigDecimal再做乘法运算)
2021-02-20 21:11:41
148
转载 每天一个Linux
转载至https://blog.youkuaiyun.com/weixin_43314519/article/details/106934678?utm_medium=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.add_param_isCf&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.add_param_isCf 一、基本命令操作 常用键 Tab按
2020-10-11 10:31:04
169
原创 Java中double相乘精度缺失问题
今天在写项目的过程中遇到了这样一个问题 10.79 * 350 = 3776.4999999999995 而不是原来应该出现的 3776.5 导致四舍五入的过程中少一变成3776 上网一查,发现是精度缺失导致的 解决办法: 相乘前将其从double类型转换为BigDecimal类型 BigDecimal price = new BigDecimal(350); BigDecimal unit = new BigDecimal(10.79); BigDecima
2020-10-11 10:12:26
1881
原创 如何分析算法的运行时间(以插入排序为例)
一个算法在特定输入上的运行时间是指执行的基本操作或步数量。 简单来说就是执行每行()伪代码所需演的时间()。 接下来看下面这段伪代码 行 代码 代价 次数 1 for j = 2 to A.length n 2 key = A [ j ] n-1 3 //Insert A [ j ] into the sort...
2020-03-24 16:52:20
1711
1
原创 Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid
今天在写maven+ssm框架时报如图所示错误 点开target一看,我的xxxmapper.xml文件根本就没有被打包(所以报错信息写了找不到我在xxxmapper.xml写的方法) 上网去查了查,找到如下解答 构建Maven项目的时候,如果没有进行特殊的配置,Maven会按照标准的目录结构查找和处理各种类型文件。 Maven打包时,默认java目录下只将.java编译并将编译后的class文...
2020-01-30 21:40:40
1485
原创 插入排序
应用场景 对于少量元素的排序,他是一个有效的算法 工作方式(比喻): 桌子上有很多牌,左手从中任意抽取一张,插入右手已排好序的牌组中 实现过程 桌上有牌 [5,2,4,6,1,3] 右手无牌 左手抽第一张 5 放于右手, 此时右手 [ 5 ] ,桌上[2 , 4 , 6 , 1 , 3 ] 下一趟 抽 2 ,2比5小 放于 5 前 此时右手[2,5 ] 下一趟 4 比2大 比5小 放于...
2020-01-29 23:16:39
195
原创 浅谈tomcat底层工作原理
核心功能 请求分发(接受请求信息,把它分配到各个servlet里面去) 运行流程 //启动tomcat //首先扫描所有.calss文件,根据路径拿到类信息,把注解信息单独拿出来,根据注解把一个个servlet挑出来存到map结构里 ”文件名“:“对应路径” Socket... //进行轮询操作,拿到网络数据:字符串str HttpServletRequest request = ...
2020-01-28 17:56:42
646
原创 浅淡hashmap(Java)
适用场景 读多写少(一般场景:一次写入后只剩下读) 时间复杂度 插入操作时间复杂度为O(1) 读取操作时间复杂度为O(1) 核心组成 散列表(链接法解决冲突) 散列表+红黑树( jdk1.8的新特性:当散列表格里面的数不超过8时,里面存的是链表,超过8时里面存的是红黑树(自平衡二叉查找树)从根节点开始,边比较边插入) 重hash 目的:避免数据倾斜,很多数存储到相同散列格里 需自行设置限定一个散列...
2020-01-28 16:49:40
175
原创 浅谈线程(Java)
线程及其一些相关概念 进程是操作系统中进行保护和资源分配的基本单位,操作系统分配资源以进程为基本单位。而线程是进程的组成部分,它代表了一条顺序的执行流。 其中main方法为主线程,其他开辟的线程称为子线程。 每创建一个新的线程,就会开辟一个新的栈。 当执行多个线程的时候拷贝run方法以及其内部生成的变量各一份。 (由此可以看出,run方法是绝对安全的,对run方法进行上锁是毫无意义的。因为每个线程...
2020-01-24 18:30:07
294
1
原创 Java基础知识_反射
1、getClass()方法 Employee e; Class c1 = e.getClass(); 2、调用静态方法forName获得类名对应的Class对象 String className = “java.util.Radom”; Class C1 = Class.forName(className); 如果类名保存在字符串中,并可在运行中改变,就可以使用这个方法。当然,这个方法只有在cl...
2020-01-19 17:42:53
300
原创 在elipse中应用maven通过在pom.xml中加坐标添加错误jar包删除后,程序仍在寻找的问题
今天学习应用maven的过程中,有一次添加的依赖,elipse报错提示系统找不到,于是我把他给删除了,更换了另一个版本的jar包。这一次,系统成功找到了。可是找不到之前的依赖依然的信息依然显示到Console里面。尝试 run as—>maven clean 和 project—>依旧没有用。 解决办法:关掉elipse再重新启动。 原因:不太清楚,猜测应该是缓存问题。 ...
2020-01-19 16:07:26
300
原创 一个简单的队列(Java代码)
public class QueueTest< T > { private T[] data = (T[]) new Object[20]; private int start = 0; private int end = 0; public void push(T newint) { if( end - start == data.length ) { T[] ...
2020-01-19 15:50:27
308
原创 一个简单的栈(Java代码)
public class Stack { private int[] data = new int[20]; private int index = -1; //add名字也ok public void push(int newint) { if( index + 1 == data.length ) { int[] datanew = new int[data.leng...
2020-01-19 15:48:02
184
原创 Spring中jsp与controller交互数据的六种方式
Spring中jsp与controller交互数据的六种方式1、与servlet相似,接受请求发送数据2、与第一种类似,只是把HttpServletRequest request换成了分装好的Model类对象3、获取前端input框里的account和pwd4、与第三种类似简化参数5、再次简化6、继续简化并通过ForEach方法输出数据库里的数据 1、与servlet相似,接受请求发送数据 @Re...
2020-01-13 15:20:52
2574
1
原创 int类型和float类型在内存中的存储形式
int类型 -在内存中占 4个字节,32位 表数范围:-2147483648(-231)~2147483648(231-1) 原因:0 代表 +0,-0 代表 -2^31,故负数比整数多一个。 32位二进制的最高位为符号位,当符号位是 1 的时候表示一个负数 int b =0b11010100; System.out.println(b); int c =0b00000100; System....
2019-11-13 10:46:10
2260
1
原创 128陷阱
public class test { public static void main(String[] args) { Integer i=100; Integer i1 = 100; System.out.println(i == i1); i = 1000; i1 = 1000; System.out.println(i == i1); } 运行后我们会发现 第一个Sys...
2019-11-12 23:00:27
220
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅