- 博客(17)
- 收藏
- 关注
原创 Java时间与日期
LocalDate/LocalTime 和 LocalDateTime 类用在不考虑时区的情况,默认是本地时区,即使用运行程序的计算机所设置的时区。主要功能:获得当前系统时间、与时间戳相互转换、与Date相互转换、设置年月日时分秒、增加年月日时分秒、获得年月日时分秒。Date类提供的主要功能是,与时间戳相互转换、与其它Date实例相比较、获取系统当前的日期。Date类的实例封装了一个long类型的时间戳,即从1970年1月1日起的毫秒数。相比于Date,提供了针对年月日时分秒的设置和加法。
2024-02-02 18:44:53
773
原创 JVM 类加载机制详解
需要验证阶段的原因主要是因为,字节码文件不一定是由Java代码编译而来的,在一般情况下,例如错误的类型强制转换、访问数组边界以外的数据、跳转到不存在的代码行等恶意操作无法使用Java代码实现、或者在一般的编译器中就会报错导致无法编译。常量池中包含的项目有:UTF-8编码的字符串、整型字面量、浮点型字面量、长整型字面量、双精度浮点型字面量、类或接口的符号引用、字符串类型字面量、字段的符号引用、类中方法的符号引用、字段的方法引用等等。总的来说,类加载的过程分为加载、验证、准备、解析、初始化、使用、卸载。
2023-10-09 22:00:53
146
1
原创 MySQL 索引详解
磁盘读写代价更低B+树的非叶节点没有像B树那样存放数据(B树的非叶节点结构体有Data域),所以相同大小的节点,B+树可以存放更多的索引键,一个结点能存放更多的索引键就意味着其子节点的个数越多,子节点的个数越多就意味着树的高度更低。更低的树高度就意味着更少的磁盘IO。比方说B+树的某个非叶节点存放了100个索引键,那么这个非叶节点最多就有101个子节点。查询效率更加稳定B+树的所有数据存放在同一层叶子节点中,查找不同的数据所需要的磁盘IO次数相当。范围查询、对于主键的排序查询更快。
2023-10-09 21:40:58
185
1
原创 MySQL 锁详解
这是因为,如果某个事务想获取某张表的表锁时,需要遍历表的每条记录、确定每行记录都没有锁与之互斥,才能加上表锁,开销很大,所以在加行锁之前需要先对这张表加意向锁,这样获取表级锁时就方便地知道表中会不会存在行级锁与其互斥了。但如果这个事务恰好进行了很多的操作,占用了很多的undo log,那么回滚这个事务需要花费的代价就更大,所以需要一种更好的解决方案。具体来说,子表的外键列必须指向主表中的某行数据,这是一种从属关系,相对的,主表的某行数据在删除时,默认情况下要求这行数据在其子表中没有附属的数据。
2023-10-09 21:39:53
237
1
原创 MySQL 事务详解
细分下来,update undo log记录了update操作和delete操作,在事务提交后不能直接删除,事务提交后应该放入该记录的undo log链表中,等待purge线程进行最终的删除(暂时理解为,由于需要提供MVCC机制,所以需要保存一些update undo log,当这些旧版本不再需要了,就由purge线程来真正地进行删除或者修改操作,并删除冗余的update undo log)。事务有着极其严格的定义,即必须符合ACID特性,而其中的原子性、隔离性、持久性,终究都是为了保证数据库的一致性。
2023-10-09 21:37:41
112
1
原创 Java中的乐观锁与悲观锁
乐观锁和悲观锁实际上是两种设计思想。悲观锁的设计思想悲观锁认为并发冲突的发生非常频繁,适合在写多读少的并发环境使用。在Java中,悲观锁的的实现有synchronized、ReentrantLock等。当某一线程独占悲观锁时,被加锁的代码段处于被锁定的状态,同一时间只有持有锁的线程才能执行锁块中的代码段,保证整个代码段是一个原子操作,而且锁块中的所有变量都具有内存可见性。但这存在一种弊端,其它获取不到锁的线程就会被阻塞挂起,这会导致上下文切换和重新调度开销。为啥要这么设计呢?
2023-08-24 21:48:08
197
1
原创 synchronized关键字
多线程环境下,有多个线程执行了wait()方法,需要其他线程执行notify()或者notifyAll()方法去唤醒它们,假如多个线程都被唤醒了,但是只有其中一部分是有用的唤醒操作,其余的唤醒都是无用功;在synchronized块内调用obj的wait方法,即放弃持有obj的监视器锁,进入obj的监视器锁的等待队列。当某个线程获取了实例对象A的监视器锁时,其他线程无法通过实例对象A访问其中的所有用synchronized修饰的实例方法,因为实例对象A的监视器锁是互斥的。线程A被唤醒了,并且竞争到锁了。
2023-08-24 21:46:27
94
1
原创 Java异常总结
ArithmeticException:发生算术异常时抛出。例如,整数“除零”抛出该类的一个实例。虚拟机可以像禁用了抑制和/或堆栈跟踪不可写一样构造arithmecoeption对象。ArrayIndexOutOfBoundsException:使用非法索引访问数组。该索引要么为负值,要么大于或等于数组的大小。ClassCastException:两个类型间转换不兼容时引发的运行时异常。具体来说,如果试图将某个对象转换为某个更特殊的类型时,这个对象必须本身是这种更特殊的类型。
2023-08-24 21:45:02
161
1
原创 Redis的持久化
Redis从4.0版本开始引入RDB-AOF混合持久化模式,实际上是优化了AOF重写功能,在进行AOF重写时,会像执行BGSAVE命令那样,fork一个子进程,扫描整个Redis数据库来生成RDB数据,并将这些数据写入新的AOF文件中。这种持久化的核心原理在于,服务器每经过一秒后,都会以协议文本的方式将被执行的命令追加到AOF文件的末尾,在服务器重启时,可以通过重新执行AOF文件中保存的命令,将Redis数据库恢复至停机之前的状态。随着服务器的不断运行,被执行的命令越来越多,AOF文件也越来越臃肿。
2023-08-24 21:42:16
86
1
原创 Lua脚本解决超卖问题
Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。在Redis2.6之前,如果用户想添加一些Redis不具备的功能,则需要通过编写客户端代码或者修改Redis的C源代码来实现自己想要的功能,前后者的解决方案都存在一些弊端,于是Redis2.6版本引入了eval命令,使得可以在Redis服务器内部执行Lua代码。Lua脚本跟单个Redis命令以及MULTI/EXEC事务一样,都是原子操作。
2023-08-24 21:40:14
869
1
原创 Java字符串面试题之String与StringBuilder、StringBuffer之间的关系
String与StringBuilder、StringBuffer之间的关系
2023-08-01 16:47:59
74
1
原创 Java字符串面试题——String str=new String(“he”) + new String(“llo”);执行之后,究竟产生了几个对象?
3个问题带你捋清,String str=new String(“he”) + new String(“llo”);执行之后,究竟会产生几个对象
2023-08-01 10:40:17
841
2
原创 Java封装类面试题总结(自动拆箱、自动装箱、缓存池机制)
总结Java封装类的三个面试题:1.为什么要为每个基本数据类型设计封装类?2.Integer和int有什么区别?3.解释一下自动拆箱、自动装箱?缓存池机制知道吗?
2023-07-31 19:17:34
219
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅