自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 ConcurrentHashMap常见的问题

concurrentHashMap面试题

2022-06-22 21:03:18 1267

原创 线上发送邮件问题记录(Could not connect to SMTP host:smtp.exmail.qq.com,port:465)

Could not connect to SMTP host:smtp.exmail.qq.com,port:465

2022-05-23 22:05:15 10055 7

原创 mvcc深入

简介:mvcc是通过undolog实现的,是multiversion concurrency control的简称,也就是多版本并发控制,是个很基本的概念。MVCC的作用是让事务在并行发生时,在一定隔离级别前提下,可以保证在某个事务中能实现一致性读,也就是该事务启动时根据某个条件读取到的数据,直到事务结束时,再次执行相同条件,还是读到同一份数据,不会发生变化(不会看到被其他并行事务修改的数据)。不需要通过加锁来解决,本质上维护了一个数据的多个版本,使得读写操作之间没有冲突。工作在哪些隔离级别:MVCC

2022-05-09 17:00:03 736

原创 浅谈JVM

jvm

2022-03-11 15:33:13 546

原创 关于hashmap

为什么说HashMap是线程不安全的?在接近临界点时,若此时两个或者多个线程进行put操作,都会进行resize(扩容)和reHash(为key重新计算所在位置),而reHash在并发的情况下可能会形成链表环。总结来说就是在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。为什么在并发执行put操作会引起死循环?是因为多线程会导致HashMap的Entry链表形成环形数据结构,一旦形成环形数据结构,Entry的next节点永远

2021-11-20 11:28:33 2773 1

原创 volatile深入

1.在多个个线程工作内存看起来互无关联的情况下是怎么做到保证变量的可见性的?最初通过总线,总线就是一条共享的通信链路,它用一套线路来连接多个子系统。最初实现就是通过总线加锁的方式也就是上面的lock与unlock操作,但是这种方式存在很大的弊端。会将我们的并行转换为串行,从而失去了多线程的意义。因为内存和CPU的速度差太多,为了解决数据不一致问题,在CPU内部设置了少量的高速缓存,目前流行的3级缓存,那么如何在多核情况下又有多个L1级缓存,来保证数据一致性,这时候推出了MESI缓存一致性协议。然后CPU

2021-10-09 09:23:16 67

原创 CAS和AtomicLong和LongAdder

1、Java中,锁占了并发的一席之地,但是锁带来的弊端就是线程会频繁的阻塞挂起,导致上下文的切换和重新调度,增加了系统开销。CAS 即 Compare and Swap(Change),是 JDK 提供的非阻塞原子性操作 , 它通过硬件保证了比较更新操作的原子性 ,有效减小了因为上下文切换导致的开销问题。CAS底层使用的是lock cmpxchg指令,在单核CPU和多核CPU下都能保证【比较-交换】的原子性。在多核状态下,某个核执行到带lock的指令时,CPU会让总线锁住,当这个核把此指令执行完毕,再开启

2021-09-16 15:48:27 106

原创 AQS简介

AQS数据结构是基于虚拟的双向链表(CLH)加state资源的状态,底层还是基于CAS算法,通过CAS自旋来进行修改state的值CLH就是虚拟的双向队列。没有实际的队列,将请求封装成CLH队列中的一个结点,结点和结点存在关系里面的核心方法,通过tryAcquire尝试获取锁,然后通过addWaiter进行CAS,然后加入CLH中,acquireQueued判断是否可以获取锁,当线程到CLH队列头部的时候,进行一个尝试获取锁,更新锁的状态,如果更新成功,就表示获取到了锁然后移除队列。AQS定义两种资源

2021-06-10 15:59:25 131

原创 SpringCloud Ribbon

把拦截器loadbalanceIntercepter注入到restTemplate里面,当要调用restTemplate的时候,肯定会调到loadbalanceIntercepter,loadbalanceIntercepter会拦截请求,获取url,然后获得服务名,在调excute。excute方法,先获取一个负载均衡器,这个负载均衡器包括当前服务的所有server(做的集群),比如选出了三个server,然后通过getserver方法某个负载均衡算法选出一个server,核心方法chooseSer.

2021-04-04 19:32:12 73

原创 SpringCloud项目总结

项目描述:”趣学”是一个随时随地的学习软件,提供海量各种专业类型的学习课程。用户可以在线搜索,在线名师线上直播,同时提供一个电商平台,对商品进行售卖,还提供秒杀服务,对某些商品进行一个限时秒杀。涵盖的模块较多,满足高并发的需求采用 SpringCloud 作为基础架构个人职责:1.参与项目整体架构分析,搭建2.用户服务:实现用户注册,登陆,三方登陆功能3.权限服务:实现用户授权,各个微服务的授权,微服务之间的授权4.商品服务:基本的商品维护,商品的上下线,商品基于 ES 的多个维度搜索,聚合搜索

2021-04-03 11:00:51 179 1

原创 三种实现分布式锁

为什么使用?我们在分布式架构下,高并发下的情况下,对共享资源进行一个操作,会出现一个资源不一致的情况。这种问题,我们就需要使用到分布式锁。怎么使用?实现分布式锁主要有三种方案:1.数据库的排他锁我们设置一个字段作为唯一比如设置成lock当有请求来的时候,就修改成1,就相当于加锁,然后当多个请求到数据库的时候,这时候也只能保证只有修改成1的那个线程进行操作,其他线程则不能。然后当修改完成之后在将这个字段设置成0,代表解锁。其他线程就可以进行操作。缺点:太依赖数据库,如果当前线程在解锁的时候,解锁没

2021-03-19 13:30:27 180

原创 循环依赖 三级缓存解决

循环依赖的产生A对象里面依赖着B对象,B对象依赖着A对象流程:当A开始实例化A,然后初始化A,再初始化的A的时候,去实例化B,然后再初始化B,初始化B的时候在去实例化A,产生一个循环依赖。spring设置三级缓存来解决这个问题ObjectFactory是一个函数式接口,仅有一个方法,可以传入lambda表达式,可以是匿名内部类,通过调用getObject方法来执行具体的逻辑1、一级缓存放成品对象2、二级缓存放半成品对象3、放lambda表达式,来完成代理对象的覆盖过程三级缓存存的是la

2021-03-13 19:08:33 314

原创 三种代理模式(静态代理,JDK动态代理,cglib动态代理)

静态代理:一个新的类,想要代理那个类,那个类里面的方法,然后加自己的逻辑,然后再调用被代理的那个类的方法,因为两个类实现了同一个接口。 实现代理互相嵌套。动态代理:JDK动态代理:通过proxy这个类来实现,一个newproxyinstance方法来生成动态代理对象。这个方法的三个参数,第一个是被代理类的类加载器,第二个是被代理对象应该实现的哪个接口(可以实现多个接口),第三个参数,指的是被代理的对象里面的那个方法怎么做处理,比如再这个方法前后做操作。生成$ proxy0一个字节码文件,生成一个$p

2021-03-07 21:31:24 140

原创 redis的淘汰策略

在 redis 中,对于已经过期的数据,Redis 采用两种策略来处理这些数据,分别是惰性删除和定期删除惰性删除惰性删除不会去主动删除数据,而是在访问数据的时候,再检查当前键值是否过期,如果过期则执行删除并返回 null 给客户端,如果没有过期则返回正常信息给客户端。它的优点是简单,不需要对过期的数据做额外的处理,只有在每次访问的时候才会检查键值是否过期,缺点是删除过期键不及时,造成了一定的空间浪费。定期删除定期删除:Redis会周期性的随机测试一批设置了过期时间的key并进行处理。测试到的已过期

2021-01-18 10:04:25 168

原创 reids的持久化 RDB和AOF

为什么要持久化?Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失。所以Redis提供了持久化功能RDBRedis (DataBase)rdb保存的文件是dump.rdb都是在我们的配置文件中快照中进行配置的在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。Redis会单独创建 ( fork )一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结

2021-01-08 16:47:41 100

原创 Redis中的事务和watch(乐观锁)

Redis单条命令式保存原子性的,但是事务不保证原子性!Redis事务本质:一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程的中,会按照顺序执行所有的命令在事务中,并没有直接被执行!只有发起执行命令的时候才会执行!Exec的时候,操作像是在压栈一样Redis事务没有没有隔离级别的概念,所以不会存在脏读幻读重复读三个特性:一次性、顺序性、排他性事务执行流程1.开启事务==》multi2.命令入队3.提交事务==》exec127.0.0.1:6379> multi #

2021-01-07 19:24:53 306

原创 聊一聊SpringCloudNetflix的五大组件(神兽)

SpringCloud开发五大组件服务发现——Netflix Eureka客服端负载均衡——Netflix Ribbon断路器——NetflixHystrix 服务网关——NetflixZuul 分布式配置——Spring Cloud Config

2021-01-07 19:09:52 1222

原创 微服务四个常见问题,以及SpringCloud Netflix和SpringCloud Alibaba和Apache Dubbo zookeeper区别

微服务的四个问题1.服务很多,客户端该怎么访问?2.这么多服务? 服务之间如何通信?3.这么多服务? 如何治理?4.服务挂了怎么办?提出三种解决方案1.spring cloud NetFlix (一站式解决方案)api网关,Zuul组件Feign — Httpclient ---- Http通信方式,同步阻塞服务注册发现:Eureka熔断机制: Hystrix2. Apache Dubbo zookeeper (半自动,需要整合别人的!)API:没有,找第三方组件,或者自己实现Du

2021-01-03 13:52:39 701 1

原创 关于mybatis的association和collection主键映射问题

多对一:association第一种方式嵌套方式:基本数据Mapper接口,因为简写,就没有写另一个mapper了,写在一个里面,如果要写另一个mapper里面,引用的时候,从名称空间来引用sql语句,这里我resultmap没有做映射,因为数据库字段和实体类字段一致,包括主键也没有做映射,并且嵌套查询,先查主表,结果里面能看出测试结果第二种方式联表方式sql因为联表查询,直接全部一起查出来,所以resultmap必须做映射测试结果一对多第一种方式嵌套方式:基

2020-12-24 10:06:43 675 1

原创 CMS管理系统

开发工具:IDEA数据库:mysql后端框架:ssm前端框架:jquery,gridmanager插件,freemarker,bootstrap前台分为轮播图显示,文章显示,图片显示,视频显示后台分为轮播图管理,文章管理,图片管理,视频管理用户的登陆注册注销,记住我功能文章模块通过数据库查询数据,封装成一个pagebean对象,因为gridmanager接收的数据格式,为total:data,然后通过gridmanager插件进行显示,gridmanager发送请求会携带,当前页和每页数据

2020-12-23 12:57:40 3627 9

原创 线程池三种创建方式和自定义线程池ThreadPoolExecutor

为什么要用线程池?线程池的优势:线程池做的工作只要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。它的主要特点为:1.线程复用;2.控制最大并发数;3.管理线程。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的销耗。第二:提高响应速度。当任务到达时,任务可以不需要等待线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创

2020-11-18 18:43:08 385

原创 高并发的单例模式

哪里用过volatile?单线程下理想情况应该只执行一次解决办法可以加synchronized,但是加这个太重了,锁死整个方法,这时候可以用DCL(double check lock)双端检索机制DCL单例模式,任然存在隐患,因为有指令重排的存在,所以可以加上volatile来禁止指令重排...

2020-11-18 18:23:04 106

原创 CAS 乐观锁和ABA问题

CAS====》compareAndSet如果主物理内存的值跟线程期望值一样,就修改为我的更新值,不一样,就失败,需要重新获取主物理内存的值底层基于usafe,而这个类是rt.jar包sun.misc.unsafe原生类,靠的里面cpu原语保证原子性,工作思想还是靠的cas,比较和交换CAS的缺点:1.循环时间长开销大2.只能保证一个共享变量的原子操作3.会产生ABA问题“ABA问题”简称狸猫换太子CAS算法实现一个重要前提需要取出内存中某时刻的数据并在当下时刻比较并替换,那么在这个时

2020-11-14 17:23:33 130

原创 valotitle 轻量级 同步机制

可以理解为乞丐版的synchronized三大特性:1.保证可见性2.不保证原子性3.禁止指令重排(1).可见性验证添加volatile(2).验证原子性为什么出现次数少的情况?假设ABC三个线程,ABC线程可能同时读到一样的值是1到各自的内存空间,A线程修改为2,写入了主内存,通知其他线程值已经修改,这时候的BC也修改为2,准备写入回主内存的时候,被挂起,然后通知没有收到,这时候BC线程回来之后,没有接收到最新的值,所以又把2写入回主内存,这时候,主内存的2被覆盖,这就是写覆

2020-11-14 17:03:28 169

原创 生产者消费者之阻塞队列版本

通过标志位的可见,和原子的一致,和阻塞队列,实现生产者和消费者同步

2020-11-14 17:02:43 58

原创 自旋锁SpinLock小案例

自旋锁(spinlock)是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU

2020-11-13 22:38:27 216

原创 公平锁非公平锁和可重入锁(递归锁)

可重入锁(也叫做递归琐)指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码,在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁也就是说,线程可以进入任何一个它已经拥有的锁所同步着的代码块。synchronized版本Reentrantlock版本比如房子有一个大门,有一把琐,虽然卫生间也有一把锁,但是进入大门之后,就可以随意进入卫生间...

2020-11-13 22:36:00 321

原创 读写锁(ReadwriteLock)

读写锁多个线程同时读一个资源类没有任何问题,所以为了满足并发量,读取共享资源应该可以同时但是,如果有一个线程想去写共享资源,就不应该再有其它线程可以对该资源进行读或写结果总结读-读能共存读-写不能共存写-写不能共存...

2020-11-12 09:01:27 139

原创 JUC强大的三个辅助类

CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞。其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞),当计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行CyclicBarrier一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点,跟CountDownLatch相反,加一semaphore 主要用于多线程的并发控制,和资源的互斥在信号量上我们定义两种操作:acquire

2020-11-10 17:50:00 175

原创 多线程的第三种模式(callable)

我们创建线程的方式有Thread(Runnable target, String name)分配新的 Thread 对象。而我们的Callable接口与Runnable接口没有关系,怎么办呢?这是找一个与两个接口都有关系的类 FutureTask这个类实现了Runnable,并且它有一个构造方法FutureTask(Callable callable)创建一个 FutureTask,一旦运行就执行给定的 Callable。这时候就把两个接口联系起来了get方法一般放在最后一行主线程不耽

2020-11-08 22:35:50 95

原创 condition的作用

多线程之间按顺序调用,实现A->B->C三个线程启动,要求如下:A打印5次,B打印10次,C打印15次接着A打印5次,BB打印10次,C打印15次…来10轮1.高聚低合前提下,线程操作资源类2.交互判断/干活/通知3.多线程交互中,必须要防止多线程的虚假唤醒,也即(判断只用while,不能用if)4.标志位condition的作用 ,精准打击资源类三个方法整合成一个方法...

2020-11-07 21:35:03 499

原创 基于Lock的卖票和生产者消费者案例

1.三个售票员卖出30张票线程 操作(对外暴露的调用方法) 资源类2.生产者消费者问题题目:现在两个线程,可以操作初始值为零的一个变量,实现一个线程对该变量加1,一个线程对该变量减1,实现交替,来10轮,变量初始值为零。1.高聚低合前提下,线程操作资源类2.交互判断/干活/通知3.多线程交互中,必须要防止多线程的虚假唤醒,也即(判断只用while,不能用if)...

2020-11-07 15:41:33 82

原创 事务(注解声明式事务管理)

1、什么事务(1)事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败2、事务四个特性(ACID)(1)原子性(2)一致性(3)隔离性(4)持久性1.原子性:不可分割,要么成功都成功,失败都失败2.一致性:比如每人100,总数200,转账之后,总数依然是1003.隔离性:两个人操作同一条数据,互不干扰4.持久性:事务提交之后,表中数据修改,修改的内容不变举例:实现jack少100,lucy多1001、创建数据库表,添加记录xml配置2、创建ser

2020-11-04 19:32:07 1361

原创 AOP(基于注解对AspectJ操作)

一.AOP底层使用动态代理(1)有两种情况动态代理第一种有接口情况,使用JDK动态代理第二种没有接口情况,使用CGLIB动态代理1、使用JDK动态代理,使用Proxy类里面的方法创建代理对象(1)创建接口,定义方法(2)创建接口实现类,实现方法(3)使用Proxy类创建接口代理对象二.AOP术语1、连接点类里面哪些方法可以被增强,这些方法称为连接点2、切入点实际被真正增强的方法,称为切入点3、通知(增强)(1)实际增强的逻辑部分称为通知(增强)(2)通知有多钟类型*前

2020-11-03 12:20:45 236 1

原创 IOC操作Bean管理(基于注解方式)

IOC操作Bean管理(基于注解方式)1、什么是注解(1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值…)(2〉使用注解,注解作用在类上面,方法上面,属性上面(3)使用注解目的:简化xml 配置2、Spring针对Bean管理中创建对象提供注解(1)@Component(2)@Service(3)@Controller(4)@Repository*上面四个注解功能是一样的,都可以用来创建bean实例3、基于注解方式实现对象创建第一步引入依赖第二步开启组

2020-11-02 22:22:06 209

原创 spring基础Bean管理基于xml注入

1.基于xml注入属性1、什么是Bean管理Bean管理指的是两个操作(1) Spring创建对象(2) Spirng注入属性2.Bean管理操作有两种方式(1)基于xml配置文件方式实现(2)基于注解方式实现基于xml方式注入属性(1)DI:依赖注入,就是注入属性3.第一种注入方式:使用set方法进行注入(1)创建类,定义属性和对应的set方法,(2)在spring配置文件配置对象创建,配置属性注入4.第二种注入方式:使用有参数构造进行注入(1)创建类,定义属性,创建属性对

2020-11-01 20:36:08 707

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除