- 博客(19)
- 收藏
- 关注
原创 数据库--
你要是记账的时候把每个人的帐都翻出来记上,那肯定记不过来呀。就拿个小本本,白天把所有人的帐不管是谁,都咔咔都记上,晚上闲的时候,再把这些帐分别记到账本对应的位置上。关系型数据mysql,Oracle,SQL Server,DB2,postgreSQL。行式存储 msyql, Oracle, SQL Server,这些都是行式存储。内存的读写效率>>>磁盘的顺序读写效率>>>远高于磁盘的随机读写。非常详细的知道索引长什么样子,索引是如何把数据库组织起来的。回表,走普通索引拿到主键,从主键索引的树上去拿数据。
2024-03-10 23:34:58 506 1
原创 JAVA 锁
在第一次获得锁的时候,会进行一次CAS操作,之后这个线程再次获取锁的时候,只需要在锁的对象头上判断是否是自己的线程ID即可,比每次都有进行CAS操作的开销要低。在更新数据的时候,先读取到数据的版本号,然后进行比对,如果相同,就进行修改成功。死锁,两个或多个线程互相需要对方的资源,但无法获取资源,导致其他线程一直无法执行,解决办法,减少锁的使用或者细化锁的粒度,使用定时锁,保证锁的顺序。所有就有了双重检测锁。对于这个线程的共享变量,我上锁了,你们其他线程都不能修改,我修改完了,把锁释放了,你们才能修改。
2024-01-20 10:23:17 379
原创 使用简单的逻辑方法进行独立思考
这是一个非常复杂的世界,这个世界上有很多各式各样的观点和思维方式,作为一个程序员的我,也会有程序员的思维方式,程序员的思维方式更接近数学的思维方式,数学的思维方式让可以很容易地理清楚这个混乱的世界,其实,并不需要太复杂的数学逻辑,只需要使用一些简单的数学方法,就可以大幅提升自己的认识能力,所以,在这里,记录一篇我自己的思维方式,一方面给大家做个参考,另一方面也供更高阶的人给我进行指正。算是“开源我的思维方式”,开放不仅仅是为了输出,更是为了看看有没有更好的方式。
2024-01-20 10:07:27 869
原创 并发编程 ----多线程一定快吗?
单核处理器也是可以使用多线程来执行代码的,CPU通过给每个线程分配时间片来实现这个机制。时间片是CPU分配给每个线程的时间,每个线程在一个时间片内执行一段时间,然后切换到下一个线程,以此类推。这样就实现了多个线程在单核处理器上同时执行的效果。虽然在任意时间中,只有一个线程在执行,但是由于线程快速切换且时间片一般为几十毫秒(ms),给人的感觉就是多个线程在同时执行。这种方式称之为时间片轮转调度。CPU通过时间片分配算法来循环执行任务,当前任务在执行一个时间片后会切换到另一个任务。
2024-01-14 16:13:39 947 1
原创 JAVA中的一些并发知识和原理总结
await()方法是让线程去等待,直到满足某个条件才被唤醒,而signal()就是用来唤醒某个条件的线程。业务量变大的时候,一台机器的资源无法支撑的时候,就把相同的项目代码部署到多个机器上,使用负载均衡来对请求进行处理,将业务请求转发到压力比较小的结点机器上。是JAVA提供的一个线程本地存储机制,可以利用该机制,将一些数据缓存到某个线程内部中,该线程可以在任意时刻,任意方法获取缓存的数据。当没有核心线程可以使用,新来的线程会存放到阻塞队列中等待,阻塞队列满的时候,会创建使用临时线程来处理任务。
2023-12-04 15:13:36 1043
原创 借鉴double-checked locking(双重检测锁)解决了一个业务上小的并发问题
双重检测锁是一种用于实现单例模式的锁机制,它在多线程环境下确保只有一个实例被创建。在JAVA中,双重检测锁通常使用volatile关键字和synchronized关键字来实现。在这个示例中,getInstance()方法首先检查instance是否已经被实例化,如果没有,则进入同步块。在同步块内部再次检查instance是否为null,如果是,则创建一个新的实例。
2023-12-01 18:54:39 2137 1
原创 JVM的一些简单总结思维导图和理解
自定义类加载器加载一个类需要:继承ClassLoader,重写findClass,如果不想打破双亲委派模型,那么只需要重写findClass;如果想打破双亲委派模型,那么就重写整个loadClass方法,设定自己的类加载逻辑。
2023-12-01 16:24:41 2088 1
原创 JAVA的一些基础点和底层原理总结
HashSet和TreeSet。底层基于TreeMapHashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束;在初始化的时候,会创建一个长度为16的数组,HashMap的扩容是在判断数组的长度是否超过阈值时进行的,这个阈值是数组的长度乘以加载因子(0.75),当超过这个阈值时,会新建一个两倍长度的数组,遍历原数组上的每一个值,并且重新计算它们在新数组上的位置,将原来数组上的元素都存储到新数组对应的位置上。
2023-11-29 14:46:04 2429 1
原创 Redis总结笔记
Redis作为数据库,经常被用于速度要求严苛、数据被频繁修改的场合,如果每次修改字符串的长度都需要执行一次内存重分配的话,那么光是执行内存重分配的时间就会占去修改字符串所用时间的一大部分,如果这种修改频繁地发生的话,可能还会对性能造成影响。Redis 提供了多种高效的数据结构,如哈希表、有序集合、列表等,这些数据结构都被实现得非常高效,能够在 O(1) 的时间复杂度内完成数据读写操作,这也是 Redis 能够快速处理数据请求的重要因素之一。所以 Redis ⼀直在处理事件,提升 Redis 的响应性能。
2023-11-27 11:23:37 1007
原创 Java是值传递还是引用传递?
Java对象的传递,是通过复制的方式把引用关系传递了,因为有复制的过程,所以是值传递,只不过对于Java对象的传递,传递的内容是对象的引用。值传递和引用传递最大的区别是传递的过程中有没有复制出一个副本来,如果是传递副本,那就是值传递,否则就是引用传递。编程语言中需要进行方法间的参数传递,这个传递的策略叫做求值策略。在程序设计中,求值策略有很多种,比较常见的就是值传递和引用传递。
2023-10-28 11:00:58 34
原创 Java中的异常
自定义异常就是开发人员自己定义的异常,一般通过继承Exception的子类的方式实现。编写自定义异常类实际上是继承一个API标准异常类,用新定义的异常处理信息覆盖原有信息的过程。这种用法在Web开发中也比较常见,一般可以用来自定义业务异常。如余额不足、重复提交等。这种自定义异常有业务含义,更容易让上层理解和处理。
2023-10-28 10:52:49 48
原创 接口和抽象类
一般在实际开发中,我们会先把接口暴露给外部,然后在业务代码中实现接口。如果多个实现类中有相同可复用的代码,则在接口和实现类中间加一层抽象类,将公用部分代码抽出到抽象类中。可以参考下模板方法模式,这是一个很好的理解接口、抽象类和实现类之间关系的设计模式。所以当我们想要定义标准、规范的时候,就使用接口。当我们想要复用代码的时候,就使用抽象类。,因为我们提倡也经常使用的都是面向接口编程。接口和抽象类的职责不一样。,比较典型的就是模板方法模式。
2023-10-27 13:51:41 40 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人