- 博客(16)
- 收藏
- 关注
原创 Java内存模型JMM
什么是JMM JMM即为JAVA 内存模型(java memory model)。因为在不同的硬件生产商和不同的操作系统下,内存的访问逻辑有一定的差异,结果就是当你的代码在某个系统环境下运行良好,并且线程安全,但是换了个系统就出现各种问题。Java内存模型,就是为了屏蔽系统和硬件的差异,让一套代码在不同平台下能到达相同的访问结果。内存划分 JMM规定了内存主要划分为主内存和工作内存两种。此处的主内存和工作内存跟JVM内存划分(堆、栈、方法区)是在不同的层次上进行的,如果非要对应起来,主内存对
2021-12-28 16:52:32
280
原创 线程池的底层原理
new Thread().start(); 1. 线程的频繁创建好销毁 2. 线程的数量过多,会造成CPU资源的开销。 上下文切换 (消耗CPU资源)使用线程池进行线程复用线程池提前创建一系列的线程,保存在这个线程池中。(核心线程) 有任务要执行的时候,从线程池中取出线程来执行。 没有任务的时候,线程池放回去。Java中提供的线程池Executors1,newFixedThreadPool 固定线程数量public static ExecutorService newFixed
2021-12-27 17:59:30
1381
原创 同步锁 Synchronized底层原理
如果多个线程在做同一件事情的时候。原子性 Synchronized, AtomicXXX、Lock、 可见性 Synchronized, volatile 有序性 Synchronized,volatile在上面这段代码中,多个线程同时对多个线程添加,count++是属于Java高级语言中的编程指令,而这些指令最终可能会有多条CPU指令来组成,而count++最终会生成3条指令, 通过javap -v xxx.class 查看字节码指令如下。会出现实际结果却是小于等于20000的值。publ
2021-12-27 17:55:07
1685
原创 并发线程的启动终止底层原理
线程启动原理线程的start方法,实际上底层做了很多事情,OS调度算法有很多,比如先来先服务调度算法(FIFO)、最短优先(就是对短作业的优先调度)、时 间片轮转调度等。线程的生命周期线程终止原理stop、suspend等,这些方法可以终止一个线程或者挂起一个线程,但是这些方法都不建议使用。原因比较简单如果调用stop方法去强行中断,那么这个时候相当于是发送一个指令告诉操作系统把这个线程结束掉,如果线程的任务执行了一半操作系统强制中断线程,导致线程任务只执行了一般,最终导致数
2021-12-27 17:51:18
168
原创 二叉树相关
* 二叉树,先序遍历,中序遍历,后序遍历,层序遍历* 先序遍历:先根,在左,在右* 中序遍历:先左,在根,在右* 后序遍历:先左,在右,在根* 层序遍历:一层层的遍历public class 二叉树几种遍历方式 { public static List<Integer> preList = new ArrayList<>(); public static List<Integer> inList = new ArrayList<.
2021-12-07 10:16:43
81
原创 双指针问题(常考)
/** * 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 * 输入:"abcabcbb" * 返回值:3 * 说明:因为无重复字符的最长子串是"abc",所以其长度为 3。 */public class 最长不含重复字符的子字符串 { public static int lengthOfLongestSubstring (String s) { // 这里必须要用set,使用List会报错 Set<Charact.
2021-12-06 22:17:17
85
原创 常见排序算法
几种常见的排序算法冒泡排序-不推荐使用,面试最好不写,性能最慢/** * 冒泡排序,速度最慢,一般是不会考察 */public class 冒泡排序 { public static int[] moBaoPaiXu(int[] array) { // 外面一层训话控制循环次数 for (int i = 0; i< array.length -1; i++) { for (int j = 0; j < array
2021-12-06 22:01:35
93
原创 Redis和数据库数据不一致的问题
针对读多写少的高并发场景,我们可以使用缓存来提升查询速度。• 如果数据在Redis存在,应用就可以直接从Redis拿到数据,不用访问数据库。• 如果Redis里面没有,先到数据库查询,然后写入到Redis,再返回给应用。问题一:一旦被缓存的数据发生变化的时候,我们既要操作数据库的数据,也要操作Redis的数据,所以问题来了。现在我们有两种选择:• 先操作Redis的数据再操作数据库的数据• 先操作数据库的数据再操作Redis的数据只要有一方失败就会导致数据不一致这种情况需要更具
2021-12-06 21:26:49
3686
原创 Redis的持久化方式
Redis支持两种方式的持久化,一种是RDB方式、另一种是AOF(append-only-file)方式,两种持久化方式可以单独使用其中一种,也可以将这两种方式结合使用。
2021-12-06 21:25:24
15171
2
原创 redis做分布式锁
分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁。redis分布式锁的实现同时满足以下四个条件:互斥性。在任意时刻,只有一个客户端能持有锁。 不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。 具有容错性。只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。 解铃还须系铃人。加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。可选参数从 Red
2021-12-06 21:16:55
170
原创 Redis的内存淘汰策略,过期策略
过期策略定期删除redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定期遍历这个字典来删除到期的 key。Redis 默认会每秒进行十次过期扫描(100ms一次),过期扫描不会遍历过期字典中所有的 key,而是采用了一种简单的贪心策略。1.从过期字典中随机 20 个 key;2.删除这 20 个 key 中已经过期的 key;redis默认是每隔 100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。注意这里是随机抽取的。为什么要随机呢
2021-12-06 17:00:22
574
原创 Redis缓存雪崩,缓存穿透,缓存击穿
缓存雪崩1,缓存同一时间大面积的失效(缓存数据设置的过期时间是相同的,并且Redis恰好将这部分数据全部删光了,缓存同时失效),请求全部走数据库。2,Redis挂掉了,请求全部走数据库。导致数据库CPU和内存负载过高,甚至宕机。存雪崩如果发生了,很可能就把我们的数据库搞垮,导致整个服务瘫痪!缓存雪崩的事前事中事后的解决方案如下:对于缓存数据设置的过期时间是相同的,缓存大面积的失效1、在缓存的时候给过期时间加上一个随机值,这样就会大幅度的减少缓存在同一时间过期。2,Redis挂掉
2021-12-06 16:57:26
584
原创 Redis常用的5种数据类型底层结构是怎样构成的
前言Redis是一个基于内存中的数据结构存储系统,可以用作数据库、缓存和消息中间件。Redis支持五种常见对象类型:字符串(String)、哈希(Hash)、列表(List)、集合(Set)以及有序集合(Zset),我们在日常工作中也会经常使用它们。知其然,更要知其所以然,本文将会带你读懂这五种常见对象类型的底层数据结构。1. 对象类型和编码Redis使用对象来存储键和值的,在Redis中,每个对象都由redisObject结构表示。redisObject结构主要包含三个属性:type、enco
2021-09-24 20:58:47
473
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人