自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

ray‘s blog

CS study

  • 博客(39)
  • 收藏
  • 关注

原创 并发编程之并发基础

**重量级锁:**要进入一个同步、线程安全的方法时,是需要先获取这个方法的锁的,退出这个方法的时候,则会释放锁。如果尝试获取锁的时候无法获得,说明有别的线程正持有这个锁,此时我们当前的线程会进入到阻塞状态,等待锁的释放,然后持有锁的线程会把我们从阻塞状态唤醒,我们当前线程再去获取锁。所谓重量级锁就是,获取不到就让当前线程进入阻塞状态的锁。**自旋锁:**自旋锁不像重量级锁那样,拿不到立刻进入阻塞状态,而是当前线程进行类似于空循环,等待一段时间尝试拿锁。如果循环到一定次数还是拿不到锁,那么就会进入阻塞状态。

2023-11-29 12:25:18 39

原创 并发编程之多线程基础

线程不能看作独立应用,进程可以看做独立应用进程有独立的地址空间,相互不影响,线程是进程的不同执行路径线程没有独立的地址空间,多进程的程序比多线程程序健壮进程的切换比线程的切换开销更大Java对操作系统提供的功能进行封装,包括进程和线程运行一个程序会产生一个进程,进程至少包含一个线程每一个进程对应一个JVM实例,多个线程共享JVM里的堆,每个线程有自己独立的虚拟机栈,一个线程不能访问或干扰另一个线程的栈。这保证了线程的局部变量是隔离的。

2023-11-28 14:09:56 37

原创 JVM高频

写一个反射的例子。私有方法需要setAccessible为true。

2023-11-27 15:03:35 46

原创 redis核心原理06

在构建切片集群时,尽量使用大小配置相同的实例(例如实例内存配置保持相同),这样可以避免因实例资源不均衡而在不同实例上分配不同数量的 Slot。

2023-11-27 14:16:39 30

原创 Redis核心原理05

什么是缓存污染呢?在一些场景下,有些数据被访问的次数非常少,甚至只会被访问一次。当这些数据服务完访问请求后,如果还继续留存在缓存中的话,就只会白白占用缓存空间。这种情况,就是缓存污染。当缓存污染不严重时,只有少量数据占据缓存空间,此时,对缓存系统的影响不大。但是,缓存污染一旦变得严重后,就会有大量不再访问的数据滞留在缓存中。如果这时数据占满了缓存空间,我们再往缓存中写入新数据时,就需要先把这些数据逐步淘汰出缓存,这就会引入额外的操作时间开销,进而会影响应用的性能。

2023-11-25 20:19:33 16

原创 Java集合复习03之集合

HashMap 也就是哈希表,底层利用数组支持下标随机访问数据的特性,快速的对键值对进行增删改查操作。

2023-11-24 15:58:14 19

原创 Redis核心原理04

如果不存在,就不用再去数据库中查询了。如果业务层的确要求有些数据同时失效,你可以在用 EXPIRE 命令给每个数据设置过期时间时,给这些数据的过期时间增加一个较小的随机数(例如,随机增加 1~3 分钟),这样一来,不同数据的过期时间有所差别,但差别又不会太大,既避免了大量数据同时过期,同时也保证了这些数据基本在相近的时间失效,仍然能满足业务需求。缓存穿透是指要访问的数据既不在 Redis 缓存中,也不在数据库中,导致请求在访问缓存时,发生缓存缺失,再去访问数据库时,发现数据库中也没有要访问的数据。

2023-11-24 13:57:27 22

原创 Java SE复习02

序列化就是指将 Java 对象转换成二进制字节流的过程。当我们需要对某些对象进行持久化时,需要先对它们序列化成二进制字节序列,然后存到数据库或者内存中。或者两个 Java 进程远程通信时,也需要将 Java 对象转换为字节序列才能在网络中传送。首先被序列化的对象一定需要实现 Serializable 或 Externalizable 接口。

2023-11-23 16:57:30 12

原创 Java基础复习01

toString( ) 返回的是对象的字符串表示,默认为 「class 名 + @ + hashCode 的十六进制表示」,我们一般会在子类将它重写为打印各个字段的值,在调试和打日志中用的多。equals( ) 和 hashCode( ) 通常用于对象之间的比较。其中 equals( ) 用于判断两个对象是否相等,默认使用 “= =” 判断,hashCode( ) 用于获取对象的哈希码,默认以对象的内存地址为参考。

2023-11-23 16:00:37 18

原创 框架其他02

可以在mapper.xml中进行配置,cache,配置size【对象数目】,超过数量的时候的清除策略【FIFO、LRU等】,清除的频率【60000,一分钟清理一次】,readOnly=true【这样的话多个会话所看到的缓存对象才一致】springmvc是spring的子项目用于提供web,替代传统的servlet,其中controller要被容器管理应用到了ioc,以及拦截器会运用到aop,进行功能扩展与控制。另外,被二级缓存的对象的类需要实现serializable接口,需要被序列化。

2023-11-22 17:28:39 13

原创 框架其他01

方法上,@ResponseBody,只返回json数据,不跳转页面,也可以在类上加上@RestController,这样所有方法默认加上了@ResponseBody。在方法上,查询操作,@GetMapping(“地址/{可变参数,DEPT}”),形参上加上@Pathvariable(DEPT)浏览器,服务器地址+注解中的地址+自己需要填写的参数,返回json数据,前端中使用ajax接受json数据,显示在页面中。对控制器方法【对注解中配置的url拦截】拦截后进行前置、后置处理,底层也是AOP。

2023-11-17 22:31:50 20

原创 Spring-面试题

所以,spring就将依赖进行了解耦,这就是控制反转,将对象的控制权交给第三方的IoC容器,这里是applicationContext,让第三方的容器在运行时创建对象。但是如果使用spring的容器根据类名去创建,然后通过修改xml文件中bean的类的信息就会很方便了,此时一千个类中的UserDAO他实际指代的类就是UserExtDao了,不需要额外的修改了。懒加载,默认为false,如果设置为true,scope为singleton,只有在第一次需要用到这个bean的时候,才会初始化这个对象。

2023-11-17 21:46:08 14

原创 Redis核心原理03

因为,这都会造成大量 key 在同一时间过期,导致性能变慢。所以,一旦该条件触发,Redis 的线程就会一直执行删除,这样一来,就没办法正常服务其他的键值操作了,就会进一步引起其他键值操作的延迟增加,Redis 就会变慢。例如,对于 Hash 类型的 bigkey 删除,你可以使用 HSCAN 命令,每次从 Hash 集合中获取一部分键值对(例如 200 个),再使用 HDEL 删除这些键值对,这样就可以把删除压力分摊到多次操作中,那么,每次删除操作的耗时就不会太长,也就不会阻塞主线程了。

2023-11-17 20:00:18 20

原创 redis核心原理02

不过,RedisTimeSeries 的底层数据结构使用了链表,它的范围查询的复杂度是 O(N) 级别的,同时,它的 TS.GET 查询只能返回最新的数据,没有办法像第一种方案的 Hash 类型一样,可以返回任一时间点的数据。现在我们知道了,同时使用 Hash 和 Sorted Set,可以满足单个时间点和一个时间范围内的数据查询需求了,但是我们又会面临一个新的问题,也就是我们要解答的第二个问题:如何保证写入 Hash 和 Sorted Set 是一个原子性的操作呢?此时,消费者可能会收到多条重复的消息。

2023-11-17 19:22:48 22

原创 Javaweb-其他

tomcat解析每一个web应用程序的xml文件,找到与之匹配的url以及servlet name,对这个servlet进行实例化与初始化。servlet默认情况下是第一次访问的时候实例化的,也可以通过配置xml使其在服务器启动的时候实例化。请求中包括,映射好别名的请求地址,请求的参数。tomcat执行这个实例的service方法中的doGet,doPost等方法。http请求包含:请求行,请求头,请求体。http响应包含:响应行,响应头,响应体。请求转发:服务器跳转,只会产生一次请求。

2023-11-15 13:11:11 21

原创 Javaweb之单点登录

这个过程,也就是单点登录的原理,用下图说明。有了会话机制,登录状态就好明白了,我们假设浏览器第一次请求服务器需要输入用户名与密码验证身份,服务器拿到用户名密码去数据库比对,正确的话说明当前持有这个会话的用户是合法用户,应该将这个会话标记为“已授权”或者“已登录”等等之类的状态,既然是会话的状态,自然要保存在会话对象中,tomcat在会话对象中设置登录状态如下。无论web系统内部多么复杂,对用户而言,都是一个统一的整体,也就是说,用户访问web系统的整个应用群与访问单个系统一样,登录/注销只要一次就够了。

2023-11-15 12:31:55 108

原创 redis核心原理01

虽然 1 字节的值能表示的数值范围是 0 到 255,但是压缩列表中 zlend 的取值默认是 255,因此,就默认用 255 表示整个压缩列表的结束,其他表示长度的地方就不能再用 255 这个值了。在签到打卡的场景中,我们只用记录签到(1)或未签到(0),所以它就是非常典型的二值状态,在签到统计时,每个用户一天的签到用 1 个 bit 位就能表示,一个月(假设是 31 天)的签到情况用 31 个 bit 位就可以,而一年的签到也只需要用 365 个 bit 位,根本不用太复杂的集合类型。

2023-11-14 16:50:26 32

原创 单例模式的不同写法

【代码】单例模式的不同写法。

2023-11-13 13:50:39 18

原创 Spring中的设计模式

它表示的是一种对象与对象之间具有依赖关系,当一个对象发生改变的时候,这个对象所依赖的对象也会做出反应。Spring AOP 就是基于动态代理的,如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候Spring AOP会使用Cglib ,这时候Spring AOP会使用 Cglib 生成一个被代理对象的子类来作为代理。我们能否根据客户的需求在少修改原有类的代码下动态切换不同的数据源?

2023-11-13 13:12:48 25

原创 MySQL之锁

当事务 A 还没提交的时候,事务 B 向该表插入一条 id = 4 的新记录,这时会判断到插入的位置已经被事务 A 加了间隙锁,于是事物 B 会生成一个插入意向锁,然后将锁的状态设置为等待状态(PS:MySQL 加锁时,是先生成锁结构,然后设置锁的状态,如果锁状态是等待状态,并不是意味着事务成功获取到了锁,只有当锁状态为正常状态时,才代表事务成功获取到了锁),此时事务 B 就会发生阻塞,直到事务 A 提交了事务。根据两阶段锁协议,不论你怎样安排语句顺序,所有的操作需要的行锁都是在事务提交的时候才释放的。

2023-11-01 18:19:15 29 1

原创 MySQL之索引模块

树形结构例如想 B 树,B+ 树,二叉查找树都是有序的,所以查询效率很高,可以再 O(logn) 的时间复杂度查找到目标数据。哈希表虽然能够再 O(1) 查找到目标数据,不过如果我们要进行模糊查找的话,却只能遍历所有数据,并且如果出现了极端情况,哈希表冲突的元素太多,也会导致线性时间的查找效率的。如果是查找效率(即比较次数)的话,实际上二叉树可以说是最快的了,但是,我们的文件索引是存放在磁盘上的,所以我们不仅要考虑查找效率,还要考虑磁盘的寻址加载次数哦,而这也是我们为什么要用 B 树的原因。

2023-10-31 17:10:53 44 1

原创 redis复习6-10题

另外,在渐进式 rehash 进行期间,新增一个 key-value 时,会被保存到「哈希表 2 」里面,而「哈希表 1」 则不再进行任何添加操作,这样保证了「哈希表 1 」的 key-value 数量只会减少,随着 rehash 操作的完成,最终「哈希表 1 」就会变成空表。写入缓存的数据,都是从mysql中查询出来的,数据都是先写入mysql的,写入mysql的时候要加一个时间戳表示这个数据是什么时候更新的,然后要写入redis的时候,从mysql查的数据要加上时间戳。

2023-10-30 21:00:36 84 1

原创 redis复习1-5题

【代码】redis复习1-5题。

2023-10-29 20:59:08 70 1

原创 JVM其他考点

在 Java 中,我们可以通过继承。

2023-10-27 21:46:20 36 1

原创 JVM之垃圾回收

垃圾回收(Garbage Collection,GC)是计算机程序在运行时自动回收不再被使用的内存的过程。这是为了防止因长时间运行程序而导致的内存泄露。Java 的 JVM、Python 解释器、.NET 平台等都使用了垃圾回收机制。以上所述的每种策略都有其优点和缺点。在实际的垃圾回收实现中,经常会结合多种策略来获得最佳的性能和效率。例如,Java 的 HotSpot JVM 使用的是一种组合了复制和标记-清除的方法,其中新生代使用复制算法,而老年代使用标记-清除-整理算法。

2023-10-26 21:53:18 40

原创 九种分布式ID生成策略

Universally Unique Identifier,通用唯一识别码。UUID是基于当前时间、计数器和硬件标识(通常为无线网卡的MAC地址)等数据计算生成的。UUID 是由一组32位数的16进制数字所构成,以连字号分隔的五组来显示,形式为 8-4-4-4-12,总共有 36个字符(即三十二个英数字母和四个连字号)。

2023-04-11 17:16:23 594

原创 集合源码详解

集合是存储数据的容器。

2023-04-07 17:31:10 663

原创 红黑树,B树,B+树

innoDB每个节点的存储限制为16KB,所以叶子节点假设一条数据1kb,一个叶子节点就能存储16条数据。红黑树不适合做MySQL的存储数据结构,树的深度和节点很大,涉及的io操作比较消耗性能。度数为3的情况下,最多有三个子节点,下图这种情况下可以是四个子节点,所以需要裂变。只存key值在非叶子节点,叶子节点存数据,叶子节点之间是有序相连的。减少了树的深度,减少了IO次数。

2023-04-06 19:30:23 47

原创 线性数据结构&BST,Balanced BST,2-3-4树

查找最大值:沿着根节点的右子树一路查找,知道最后一个不为空的节点,该节点就是当前这个树的最大节点。查找最小值:沿着根节点的左子树一路查找,知道最后一个不为空的节点,该节点就是这个树的最小节点。起源于2-3-4树,本质是2-3-4树。查找前驱节点:小于当前节点的最大值。查找后继节点:大于当前节点的最小值。

2023-04-06 19:27:52 82

原创 01.Spring概述

控制反转DI,依赖注入存放对象beanMap配置文件(Bean定义信息):xml,properties,yaml…解析处理文件:将配置文件解析为beanDefinition,将这一步抽象为一层处理解析的规范[beanDefinitionRead接口],方便扩展【各种格式文件解析为beanDefinition】beanDefinition进行对象创建:反射【为什么不是new?通过反射可以获取对象的所有属性,方法,甚至注释等信息】springbean的scope反射BeanFactory在容器创建过程中需要动

2022-10-24 15:16:52 212

原创 04-重构设计模式之decorator装饰器模式(对子弹加方框和尾巴)

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。我们通过下面的实例来演示装饰器模式的用法。Bullet和Explode、tank、wall中添加getWidth()和getHeight()方法,删除原本的x,y。GODecorator,游戏对象装饰器。对发射的子弹,做一个方框和尾巴的装饰。

2022-09-06 16:06:47 838

原创 03-重构设计模式之chain_of_responsibility责任链模式(子弹、坦克、墙碰撞)

为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。tank.back():用oldX和oldY记录上一步的位置,坦克相互撞击后回到上一步 添加一堵墙 GameModel做成单例 对GameModel的add方法做优化。抽象出GameObject让坦克、子弹等继承。GameModel中的主战tank做成单例。

2022-09-06 15:53:29 94

原创 02-重构设计模式之strategy策略(坦克射击)

定义了一族算法(业务规则);封装了每个算法;这族的算法可互换代替(interchangeable)comparablecomparatorcatdogSorter 利用传入的数据类型自己的比较方法进行排序Main。

2022-08-30 12:00:59 173

原创 01-重构设计模式之singleton单例(7种)

单例模式,也叫单子模式,是一种常用的软件设计模式,属于创建型模式的一种。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。

2022-08-30 11:42:03 154

原创 坦克大战-基础版03

修改一些固定参数到配置文件,添加getInt。初始化ImageUtil类,对图片进行操作。增加Audio类,控制声音。在tf中添加爆炸list。bullet的fire中。

2022-08-30 11:24:55 123

原创 坦克大战-基础版02

只要四个键都没按,坦克就是静止的tank类添加moving属性。

2022-08-28 19:48:15 112

原创 坦克大战-基础版01

在tankFrame类中添加键盘监听事件【press&release】抽象出坦克类,封装相应的属性和方法,在tankFrame中直接调用。因为只有在tankFrame中调用这个类所以使用内部类。添加键盘处理,根据上下左右按键状态,判定坦克移动方向。在窗口里面画出一个正方形(左上角坐标为x,y)根据速度和方向以及按键,调整坦克位移。...

2022-08-28 19:06:59 334

原创 CS:ASP-Chapter 1

深入理解计算机系统

2022-06-08 17:20:07 172 1

原创 JavaSE复习

JavaSE复习面向对象之前面向对象之前位运算 int i = 21; System.out.println(i<<2);//相当于21*2^2=84 System.out.println(i<<26);//极限值 System.out.println(i<<27);//负数使用位运算进行数值交换优点是不需要增加临时变量,效率高,缺点是只能用于数值类型的计算int a = 10; int

2021-03-07 20:19:42 72

空空如也

空空如也

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

TA关注的人

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