- 博客(29)
- 收藏
- 关注
原创 spring boot2项目升级到spring boot3 jdk8升级到17
spring boot2项目升级到spring boot3 jdk8升级到17
2023-10-04 21:32:39 797
原创 基于redis的分布式锁
若给节点增加从节点,从而提高可用性, 但主从同步时仍然可能出现不一致的情况, 如主加锁成功,但在同步前宕机, 从节点变为主,没有锁。锁续命:在获得锁后, 增加一个定时任务,定期检测任务线程是否已执行完成,若未完成,则延长锁的过期时间。解决:加锁时候,value添加唯一标识(uuid), 解锁的时候判断是否是自己加的锁,然后删除锁。问题2:在删除锁逻辑中, 判断是否自己锁和删锁并非原子操作,还是会出现超时后删别人锁的情况。当为了性能,节点部署不多时,节点宕机容易造成半数锁失败,红锁 red lock。
2023-04-12 17:01:41 153
原创 分布式缓存问题与解决
5、在update操作时,需要更新数据库,更新缓存两个操作,这两个操作是非原子性的,在两个操作之间,数据库与缓存数据是不一致的,此时的不一致时间还不是很长。--------双写不一致。3、若管理端删除了某个数据,前端还停留在被删数据页面,此时前端请求了已经不存在的数据,缓存查找没有,会访问数据库,前端若一直请求,会持续对数据库造成压力。4、若大量并发瞬间访问了一个冷门数据(无缓存的),请求发现无缓存,会进行缓存重建,大量请求进行缓存重建,对数据库压力较大。------------缓存重建。
2023-04-12 17:00:05 229
原创 ThreadLocal内存泄漏的原因
Entry继承自WeakReference, Entry在构造函数使用super(k) 等同于 new WeakReference(key);如果不在key没被gc前,进行remove, 就没办法再通过key找到对应的value, value就会一直存在。也就是将key设置成弱引用, 当key的强引用都断开后,下次gc,key就会被清理掉。在扩容时, 会遍历Entry数组,清理掉key为null的数据。但如果一直不扩容, 则内存一直在占用, 所以需要手动清除下。此时Entry的key 就为null了。
2023-04-12 13:16:56 105
原创 ThreadPool
线程开启后会先执行一个提交的任务,然后再去阻塞队列去循环取任务执行,所以新开启的线程,可以直接运行一次任务,不用从队列里取。若当前线程数大于核心线程数, 使用超时阻塞取任务,若超时后仍然没有任务,则进行cas竞争,成功的线程跳出循环,结束线程。手动中断 shutdown shutdownNow, 直接对某一个线程中断无效,会被捕获中断,继续执行。可以自定义线程工厂类,给每个线程设置一个线程异常捕获方法,就可以自定义处理异常,而不会退出线程。当任务抛出异常后,线程也会被关闭,线程池会立即新增一个线程替补。
2023-04-12 13:09:26 69
原创 java - AQS
AQS是指AbstractQueuedSynchronizer类, 该类是JUC包下所有互斥锁的实现基础。它也是按照管程思想实现的。其中AQS,是管程的实现:state, 0无锁, 1有锁,大于1时表示锁重入了多次,加锁时一般通过cas修改state,修改成功意味着竞争到了锁。:通过双向链表实现,通过变量head tail维护,该队列按照先入先出,所以基于AQS的锁,很容易实现公平锁。
2023-04-12 13:05:34 118
原创 synchronized
当两个先后执行的线程,第一个线程完全结束后,开启第二个线程,共同持有同一个锁时,由于是先后执行没有交集都应该是偏向锁,并且锁头部中的线程id为各自线程。偏向锁撤销: 不等同于偏向锁解锁,偏向锁撤销一般是由于锁升级造成的,而加锁的前提条件是需要无锁状态,所以偏向锁撤销就是把锁的对象头转为无锁状态,然后等待加锁。需要等到安全点的时候。因为线程获取锁是通过cas操作的,在cas中,期望值是null,修改值为自身线程id, 所以锁切换线程时,必须要先变为无锁,才能再锁,否则cas无法成功。
2023-04-12 13:03:10 55
原创 并发可见性与总线窥探机制
在java并发编程中,要保证可见性,需要给变量增加volatile关键字。普通变量存在可见性的原因是多核CPU架构中各处理器缓存不一致造成的,需要解决缓存不一致问题,才能保证可见性,总线窥探就是实现缓存一致性的方案之一。
2023-03-21 23:32:39 157
原创 6、JVM参数设置
-Xss:每个线程的栈大小-Xms:设置堆的初始可用大小,默认物理内存的1/64-Xmx:设置堆的最大可用大小,默认物理内存的1/4
2023-03-19 14:42:59 223
原创 5、垃圾收集器
serial parallel parNew cms g1 全是分代思想的实现者,所以分代思想的优化方式都是通用的,标记算法全是可达性算法实现。
2023-03-19 14:41:04 59
原创 2、类加载-方法区
类的加载阶段分别有:加载,验证,准备,解析,初始化其中只有加载是java层面完成的,将class文件载入到内存,后续都是通过调动native方法完成
2023-03-19 14:32:42 195
原创 11、mysql配置优化
最大连接数,每个连接都会占用一定的内存,在查询时传输数据占用内存会加剧,所以要根据系统内存合理配置最大连接数,防止过多占用内存。
2023-03-19 14:20:12 816
原创 7、mysql innodb 底层原理
mysql主要分为Server层和存储引擎层Server层包含连接器,查询缓存器,分析器,优化器,执行器,实现了数据库主要功能。
2023-03-09 14:43:05 82
原创 6、MVCC
MVCC(Multi-Version Concurrency Control) 多版本并发控制作用:在RC RR级别下,实现读写并发,读操作不受写的影响。实现:innodb层面实现,通过undo log和可见性算法实现。
2023-03-09 14:42:15 54
原创 3、索引优化
为了提高mysql的查询速度,需要尽可能的使用到索引,否则mysql只能通过全表扫描,此时查询效率会很低, 但是如果表内数据很少, 全表扫描反而可能会更快。
2023-03-09 14:36:07 114
原创 2、mysql工具explain trace
explain用于显示mysql对sql语句的执行计划,如语句的分解情况,是否使用了索引,表关联使用何种算法,如何排序等。 通过mysql的执行计划,结合mysql数据结构可以分析出该sql执行效率,然后进行优化。
2023-03-09 14:30:11 219
原创 1、索引数据结构
数据库索引是数据库为了快速访问的一种数据结构。是一种排好序的数据结构。索引是有序的,是索引非常重要的特点,索引的高效几乎都是建立在有序的基础上。
2023-03-09 14:24:17 797
原创 spring cloud feign实现
feign的底层实现为io.github.openfeignspringcloud整合了底层实现,同时整合的还有ribbon与hystrix本文描述了springcloud如何对openfeign进行整合的一、原生的openfeign不用springcloud-openfeign,直接使用openfeign的方式根据官方示例:public interface GitHub { @RequestLine("GET /repos/{owner}/{repo}/contributors")
2020-08-07 20:51:36 406
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人