- 博客(35)
- 资源 (1)
- 收藏
- 关注
转载 2021-08-04
【日常学习】AopContext.currentProxy()常规使用Spring的AOP功能,都是对一个Service中的B方法进行切入记录日志,这些时候AOP是能起作用的。但是假如A方法被service中的B方法调用,在B方法上的切入便会失效,导致无法记录日志。解决办法就,在A方法中使用((Service)AopContext.currentProxy()).B() 来调用B方法,这样一来,就能切入了!学习贴:https://www.cnblogs.com/dalianpai/p/13709403.
2021-08-04 12:07:12
106
原创 缓存如何更新
在看很多博客上介绍如何更新缓存,都会说先删缓存再更新数据库,但是仔细一想会出现数据不一致的问题,比如一个线程A更新数据,一个线程B查询数据,那么就会出现下面的步骤:A线程先删除缓存B去请求缓存时,发现没有缓存,就去数据库请求数据B将请求到的数据回写到缓存中A更新完数据库此时数据库和缓存的数据就发生不一致了。所以这种方式肯定不可取。还有的人说先更新数据库再更新缓存,这也是不行的,容易出现脏数据。下面正确的方式是:Cache Aside Pattern它是使用的最多的一种更新缓存的方式,具体
2020-08-09 00:08:54
1496
原创 读写分离数据库如何保持数据一致性
数据库读写分离主要解决高并发时,提高系统的吞吐量。因为大部分场景下都是读多写少。下图是数据库读写分离模型。每次请求打到这个系统后:读请求,直接读从库写请求,先写入主库,然后主库将数据同步到其他从库在高并发或者网络状况不理想时,写完数据后,主库还没来得及将数据同步到从库,其他读请求去读从库,发现从库中的数据仍然是旧数据。这就是读写分离数据库数据不一致的根本原因。下面给出两种方案去解决这个问题:缓存标记法上图流程:1)A发起写请求,更新了主库,再在缓存中设置一个标记,代表此数据已经更新,
2020-07-31 14:33:22
7191
6
原创 android属性动画实践及原理
动画首先明确啥是动画?你可以理解成若干不同图片随着时间不断交替成为焦点的过程,说简单点就是"量子阅读法",你还可以把动画理解成使用某多种手段将一张图片进行各种变换。那么这两种理解方式对应android里的动画就是帧动画和属性动画,当然帧动画和补间动画属于视图动画,所以android动画可以分为两大类:视图动画和属性动画。View动画操作对象是view,而属性对象操作的是任何对象甚至是无对象。View动画基本上只支持4中动画效果,也就是最简单的平移、旋转、缩放、透明度。当然如果你不满足这4中基本动画效果
2020-06-10 18:15:00
351
原创 观察者模式
背景在现实生活中,经常出现观察者模式这种场景,比如对于烧水这件事,水是我要观察的对象,那么我就是一个观察者,观察者模式一般是一种一对多的关系,可以有任意个(一个或多个)观察者对象同时监听某一个对象。监听的对象叫观察者(后面提到监听者,其实就指观察者,两者是等价的),被监听的对象叫被观察者(Observable,也叫主题Subject)。被观察者对象在状态上发生变化时,会通知所有观察者对象,使它们能够做出相应的变化(如自动更新自己的信息)。实现简单地说,当被观察对象发生某种变化时,被观察对象需要通知观察
2020-06-08 17:19:47
179
1
原创 代理模式
背景代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。在实际应用中对用于对调用的方法进行拦截然后将方法增强以适应各种特殊的需求场景!!代理分为静态代理和动态代理,区分就是静态代理是编译时就生成的,而动态代理是运行时生成的!!这里主要是看需要,没有绝对的好坏,静态代理速度快,而动态代理灵活!!静态代理简单的说就是让代理类也去实现被代理类的接口!!换句话说被代理的对象和代理类都实现
2020-06-07 21:12:47
129
原创 #算法系列#单调栈
问题引入废话不多说,首先看一道leetcode原题,柱状图中最大的矩形。题目描述:给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。输入: [2,1,5,6,2,3]输出: 10问题分析直接思路就是枚举每一个矩形,以该矩形为高,然后向左向右延伸,就可以计算面积。那么问题来了:怎么向左向右延伸?—>左右边界如何确定?其实很简单:1、左边界:找到大于等于当前柱形高度的最左边元素的下标2、右边界:找到大
2020-06-07 10:53:31
187
转载 #一文读懂系列# View事件分发机制
Android View 虽然不是四大组件,但其并不比四大组件的地位低。而View的核心知识点事件分发机制则是不少刚入门同学的拦路虎。ScrollView嵌套RecyclerView(或者ListView)的滑动冲突这种老大难的问题的理论基础就是事件分发机制。MotionEvent事件初探我们对屏幕的点击,滑动,抬起等一系的动作都是由一个一个MotionEvent对象组成的。根据不同动作,主要有以下三种事件类型:ACTION_DOWN:手指刚接触屏幕,按下去的那一瞬间产生该事件ACTION_MOV
2020-06-04 21:03:08
169
原创 android架构MVP模式
背景为啥需要有MVP模式?根本在于我们的Activity太重了,承担的功能过于复杂,不符合软件开发高内聚低耦合的要求,所以需要我们可以仿照网页开发MVC模式,将传统的Activity一分为二,将视图和控制视图逻辑抽离出来,也就是这里的View和Presenter,当然Model还是保持一致的。当View与Model解耦后就不一样了,因为View并不知道Model的存在,我们可以直接对Model进行单元测试,无需依赖 Android 的环境。同理当我们进行 UI 测试时,可以通过 Mock 测试用数据来检
2020-06-04 11:23:23
272
原创 OkHttp的第一课
在android客户端开发中,使用http协议向服务器交换数据时最平常的,SDK中自带的HttpURLConnection虽然能基本满足需求,但是日常使用中基本不会使用,andriod开发的思路就是坚决不造轮子,追求使用最好的轮子。所以square公司实现了一个HTTP客户端的类库——Okhttp 。首先我们的导入相关依赖:implementation ‘com.squareup.okhttp3:okhttp:3.3.1’核心类基本上就用四个类:OkHttpClient、Request、Call
2020-06-02 18:11:20
215
原创 Integer类的缓存机制
看到Integer类,我们首先想到它是int基本数据类型的包装类,是Java语言万物皆对象思想的产物,我们可以使用至少两种方式构建一个Integer对象,一种是直接new,另外一种中是通过静态方法Intege.valueOf()方法创建它。下面是一个最常见的考察Integer类的代码:Intger a = new Integer(127); //第一种方式Intger b = Interger.valueOf(127); //第二种方式Intger c = Interger.valueOf(127
2020-06-02 14:09:20
315
原创 Git命令学习
git基本命令下图就是git的核心架构,我的理解就是:Remote:远程仓库,这就是程序员的大锅饭Repository:本地仓库,这是程序员从大锅里捞出来的,可以理解成个人小灶Index/stage:暂存区,这就是用来缓存一些文件操作的地方,让程序员有后悔的药吃workspace:工作区,这里就是程序员自我发挥的地方了。1 建库我们可以创建本地仓库,通过命令git init //初始化当前目录为一个Git仓库git init [目录名] //新建一个目录,将其初始化为
2020-05-29 14:48:43
213
转载 CMS垃圾回收机制问题
转载于:面试官100%会严刑拷打的 CMS 垃圾回收器cms工作流程:初始标记:仅仅只是标记一下GC Roots能直接关联到的对象,速度很快,需要“Stop The World”。并发标记:进行GC Roots Tracing的过程,在整个过程中耗时最长。重新标记:为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长...
2020-05-04 16:50:34
290
转载 Spring中循环依赖解决方法
转载于:循环依赖解决循环依赖产生原因:两个及两个以上的bean相互包含彼此。涉及到的知识点:bean的生命周期,bean的依赖注入方式。首先我们知道bean有两种依赖注入方式:构造器注入和setter注入,而setter方式注入有分为单例(singleton)和原型(prototype)注入。构造器注入和setter注入的原理是不同的。构造器注入Spring容器会将每一个正在创建的 Be...
2020-05-04 16:17:54
255
转载 简述SpringBoot启动流程
转载于:SpringBoot启动流程总结先写个总结:1、new了一个SpringApplication对象,使用SPI技术加载spring.factories文件中ApplicationContextInitializer、ApplicationListener 接口实例2、调用SpringApplication.run() 方法3、调用createApplicationContext()...
2020-04-23 22:26:41
637
转载 CyclicBarrier和CountDownLatch的用法与区别
转载于:CyclicBarrier和CountDownLatch的用法与区别两者区别CountDownLatch的计数器只能使用一次。而CyclicBarrier的计数器可以使用reset()方法重置。所以CyclicBarrier能处理更为复杂的业务场景,比如如果计算发生错误,可以重置计数器,并让线程们重新执行一次。CountDownLatch会阻塞主线程,CyclicBarrier不会...
2020-04-08 21:51:35
160
转载 HashMap详解以及常见面试题
转载于:https://blog.csdn.net/Yoga0301/article/details/84452104HashMap的实现采用了除留余数法形式的哈希函数和链地址法解决哈希地址冲突的方案。这样就涉及到两种基本的数据结构:数组和链表。数组的索引就是对应的哈希地址,存放的是链表的头结点即插入链表中的最后一个元素,链表存放的是哈希地址冲突的不同记录。实现当我们往HashMap中put...
2020-03-23 12:15:57
263
原创 完全搞懂Spring Bean生命周期
引言Spring Bean的生命周期只有四个阶段。把这四个阶段和每个阶段对应的扩展点糅合在一起虽然没有问题,但是这样非常凌乱,难以记忆。要彻底搞清楚Spring的生命周期,首先要把这四个阶段牢牢记住。实例化和属性赋值对应构造方法和setter方法的注入,初始化和销毁是用户能自定义扩展的两个阶段。实例化 Instantiation属性赋值 Populate初始化 Initializatio...
2020-03-20 16:21:24
782
转载 redis集群(Sharding)和在线扩容(Pre-Sharding)
转载于:https://blog.csdn.net/rosanu_blog/article/details/68066756redis集群分为服务端集群和客户端分片,redis3.0以上版本实现了集群机制,即服务端集群,3.0以下使用客户端分片(Sharding)。redis3.0服务端集群使用哈希槽,计算key的CRC16结果再模16834。3.0以下版本采用Key的一致性hash算法来区分k...
2020-03-18 21:03:48
266
原创 详解分布式寻址算法
引言在分布式系统中,对数据的准确定位以及整个系统的结构具有很高的要求。下现代分布式寻址算法中,主要以下面三种算法为代表:hash 算法(大量缓存重建)一致性 hash 算法(自动缓存迁移)+ 虚拟节点(自动负载均衡)redis cluster 的 hash slot 算法(也叫hash槽)hash算法比较适合固定分区或者分布式节点的集群架构。一致性hash算法比较适合需要动态扩容的分...
2020-03-18 20:51:41
2073
转载 Redis持久化
转载于:https://blog.csdn.net/ThinkWon/article/details/101522209Redis 提供了RDB和AOF两种持久化方式。默认是只开启RDB,当Redis重启时,它会优先使用AOF文件来还原数据集。RDB 持久化(快照持久化)RDB 持久化:将某个时间点的所有数据都存放到硬盘上。可以将快照复制到其它服务器从而创建具有相同数据的服务器副本。如果系...
2020-03-18 12:50:00
74
转载 理解Java线程池
深度解读 java 线程池设计思想及源码实现https://www.javadoop.com/post/java-thread-pool这边文章里都是用源码形式讲解线程池的运行原理的先简单说说这个继承结构,Executor 位于最顶层,也是最简单的,就一个 execute(Runnable runnable) 接口方法定义。ExecutorService 也是接口,在 Executor ...
2020-03-16 22:29:25
94
转载 如何深入理解JUC的核心类AQS
一行一行源码分析清楚AbstractQueuedSynchronizer本文转自:https://www.javadoop.com/post/AbstractQueuedSynchronizer在分析 Java 并发包 java.util.concurrent 源码的时候,少不了需要了解 AbstractQueuedSynchronizer(以下简写AQS)这个抽象类,因为它是 Java 并发...
2020-03-16 18:11:47
206
转载 Synchronized关键字解析
引言在Java中实现多线程同步访问共享变量的最广泛实现方法就是使用关键字synchronized。上图是JVM内存模型。我们知道JVM内存结构主要分为三大块:堆、栈和方法区。每个线程都有自己的一个虚拟机栈,栈保存着局部变量以及所有调用的方法的参数和返回值。其他线程无法访问该线程的栈中数据。栈仅能保存基本类型和对象引用,对象是存放在堆中的。堆内存和方法区中的静态变量等数据可以被线程共享,而同...
2020-03-16 17:23:49
103
原创 详解volatile关键字
引言首先volatile是轻量级的同步机制,相比synchronized同步机制。因为它不会引起线程上下文的切换和调度。但是volatile 变量的同步性较差(有时它更简单并且开销更低),而且其使用也更容易出错。这里先介绍在Java多线程的开发中有三种特性:原子性、可见性和有序性。原子性:可以直接描述成一次操作中要不一次成功,要不改变。可见性:当一个线程修改了线程共享变量的值,其它线程能...
2020-03-16 12:15:09
176
原创 MySQL的锁
引言MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。MySQL大致可归纳为以下3种锁:表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般这三种分...
2020-03-14 21:29:24
80
原创 MyISAM与InnoDB索引方式
引言MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。Myisam创建表生成三个文件:.frm 数据表结构、.myd 数据文件、 .myi 索引文件。Innodb只生成一个.frm文件,数据存放在ibdata1.log。他们索引都是通过B+树实现的,只是实现的细节有所不同。MyISAM索引实现由于索引文件仅保存数据的地址,所以以MyISAM引擎的索引过程可以别描述为首先按...
2020-03-14 18:13:40
135
原创 函数式接口
引言在java中是指:有且仅有一个抽象方法的接口。当然接口中也可以有其他方法(默认、静态、私有)Java8所有的新特性基本基于函数式编程的思想,函数式编程的带来,给Java注入了新鲜的活力。函数式编程的几个特点:函数可以作为变量、参数、返回值和数据类型。基于表达式来替代方法的调用函数无状态,可以并发和独立使用函数无副作用,不会修改外部的变量函数结果确定性;同样的输入,必然会有同样的...
2020-03-13 13:08:10
161
原创 No.1 动态规划解题套路
文章目录一、引言二、使用动态规划优化暴力方法三、实战演示下面在介绍动态规划的空间压缩法一、引言遇到一到动态规划题后,必须先自己思考找到一个暴力递归求解的方法,然后判断尝试过程是否有后效性。若无后效性,才可以套用动态规划题的模板。这里要说明的是,想出问题的暴力尝试方法这一步是最难的同时也是最重要的,而且没有固定的方法,只能通过不断做题才能又快又好的写出暴力解!无后效性:是指一个递归状态的返回...
2019-12-14 15:42:51
221
原创 EM算法估计混合高斯模型(GMM)
文章目录1、EM原理2、啥是混合高斯模型3、EM算法求解GMM4、实例1、EM原理EM本质是上是极大似然估计(MLE)概率模型有时即含有观测变量,又含有隐变量,如果概率模型的变量都是观测变量,只要show出测量数据,可以直接用极大似然估计法,或者用贝叶斯估计法估计模型参数。但是当模型含有隐变量时,就不能简单的用这些估计方法,EM算法就是含有隐变量的概率模型参数的极大似然估计法。举个例子啥是隐...
2019-06-28 09:42:19
1371
1
原创 LeetCode1038:从二叉搜索树到更大和树
一、题目描述给出二叉搜索树的根节点,该二叉树的节点值各不相同,修改二叉树,使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。下图为实例:输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]...
2019-05-29 20:22:08
715
原创 二叉堆原理及实现(C++)
文章目录一、二叉堆简介二、二叉堆的实现2.1 基本定义2.2 堆的插入2.3 堆的删除一、二叉堆简介二叉堆是完全二元树或者是近似完全二元树,按照数据的排列方式可以分为两种:大根堆和小根堆。大根堆:父节点键值总是大于等于任何一个子节点键值小根堆:父节点键值总是小于等于任何一个子节点键值性质:索引为i的左孩子的索引是 (2*i+1);索引为i的右孩子的索引是 (2*i+2);索引为i...
2019-05-28 09:55:11
1062
2
原创 二叉查找树
一、啥是二叉查找树二叉查找树(Binary Search Tree),又被称为二叉搜索树。在二叉树中有一个节点xxx,假设它有左子树lll和右子树rrr,则一定有:value[l]<value[x]且value[r]>value[r]value[l]<value[x]且value[r]>value[r]value[l]<value[...
2019-05-25 11:53:52
169
原创 回答贴:关于LMS算法步长范围推导
最陡下降法矢量迭代公式:w(n+1)=w(n)+μ(−∇(n)) \boldsymbol{w(n+1)}=\boldsymbol{w(n)}+\mu(-\boldsymbol{\nabla}(n)) w(n+1)=w(n)+μ(−∇(n))其中梯度∇=Rw(n)−P\boldsymbol{\nabla}=\boldsymbol{Rw(n)-P}∇=Rw(n)−P代入上式:w(n+1)=w...
2019-05-23 11:25:57
4328
4
原创 LMS与RLS算法学习笔记
LMS与RLS算法学习笔记一、 研究目的1.1最陡下降法理论1.2$LMS算法$1.3$RLS算法$1.4研究目标二、代码解析三、结果一、 研究目的1.1最陡下降法理论LMS算法总是与最陡下降法联合使用,顾名思义,最陡下降法就是沿着性能曲面最陡放方向向下(曲面负梯度方向)搜索曲面的最低点。迭代过程首先从曲面上某个初始点(对应与初始权矢量w(0) )出发,沿着该点负梯度方向搜索至第一点(对应与...
2018-10-21 20:13:22
32278
18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人