ChatGpt学习随笔
文章平均质量分 86
学习方式已然改变,紧跟时代。查漏补缺
Tellme3
任务艰巨在于漫长。
展开
-
掌握mysql索引和innoDB底层(叶子节点和叶子节点内部剖析)
关于mysql索引思考(innoDB底层)1、innoDB是如何存储数据的数据是保存在innoDB页中的(以页作为最小和磁盘交互的单位(也就是我们写入磁盘也叫做持久化))叶子节点存储了我们完整的用户数据(之间的不同页(或者叫不同叶?)用的是双向链表链接,叶子节点的里面的数据用的是单向链表)原创 2023-06-27 23:26:32 · 264 阅读 · 0 评论 -
同步阻塞和同步非阻塞的思考以及juc下的BlockingQueue阻塞队列
同步阻塞和同步非阻塞的思考以及juc下的Blockin同步阻塞和同步非阻塞的思考以及juc下的BlockingQueue阻塞队列(例如 take() 或 poll() 方法)时,如果队列为空,线程将被阻塞,直到有元素可用或等待超时。是的,BlockingQueue 是一种阻塞模式的队列,它提供了在队列为空或队列已满时阻塞线程的机制。在操作完成之前,进程会一直等待阻塞,无法执行其他任务,直到数据准备好或写入完成。在同步非阻塞模式下,进程在进行系统调用后立即返回,无需等待操作完成。原创 2023-06-25 19:32:26 · 68 阅读 · 0 评论 -
10、分布式锁使用mysql实现
是的,使用MySQL实现分布式锁的常见方式之一就是利用INSERT语句的行级锁。当多个事务同时尝试插入同一行数据时,只有一个事务能够成功插入,其他事务会因为锁冲突而被阻塞等待。在执行该语句时,MySQL会自动对该行数据进行加锁,确保只有一个事务能够成功插入。其他事务在插入同一行时会因为锁冲突而被阻塞等待锁的释放。需要注意的是,MySQL作为一个数据库系统,并不是专门设计用于实现分布式锁的。一种常见的方法是使用MySQL的行级锁和事务机制。在释放锁时,通过执行DELETE语句将对应的记录从锁表中删除。原创 2023-06-13 16:59:04 · 531 阅读 · 0 评论 -
7、new关键字和反射机制的思考
反射的前提是类加载完成反射机制是动态的获取类的信息并操作类的成员(字段、方法、构造函数等)注意其中的动态这个关键词反射机制和new关键字的区别,new是静态的在编译的时候就将类的信息加载好了。而反射机制是在需要的时候才使用的对应api来使用类的信息反射机制都需要使用对应的api才行(这样也就有了性能开销,还会出现安全性问题)New或者反射的时候其中类的实例信息存储在堆中,而类的机构信息(字节码、常量池、字段信息、方法信息、、、)会被加载在方法区中讲解一下反射机制。原创 2023-06-08 14:17:19 · 131 阅读 · 0 评论 -
14、lecode:剑指 Offer 29. 顺时针打印矩阵
14、lecode:剑指 Offer 29. 顺时针打印矩阵输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。原创 2023-05-27 14:57:32 · 61 阅读 · 0 评论 -
Lecode删除链表节点:关于string不可变,引用对象的思考
在 Java 中,字符串是不可变的,一旦创建了一个字符串对象,它的值就不能被改变。当你对字符串进行拼接、替换或修改时,实际上是创建了一个新的字符串对象。这是因为 a 和 b 引用的是同一个内存地址,它们都是对相同的链表进行操作。所以,对链表的任何修改都会在所有引用该链表的变量上可见。如果 a 和 b 指向同一个链表对象,它们实际上是引用同一个链表,那么对链表的修改会同时影响到 a 和 b。原创 2023-05-24 13:37:16 · 122 阅读 · 0 评论 -
4、关于hashmap不安全ConcurrentHashMap 线程安全使用分段锁机制的思考
每个段都拥有自己的锁,不同的线程可以同时访问不同的段,从而提供了更细粒度的并发性能。是的,分段锁就是将 ConcurrentHashMap 拆分为不同的段(Segment),每个段都维护着一个独立的散列桶数组和一个锁。每个段内部都有一个锁,当需要对某个段进行读写操作时,只需要获取该段对应的锁,而不会影响其他段的操作。锁的独立性:分段锁保证了每个段的锁是独立的,即一个线程对一个段的操作不会影响其他段的访问。锁的获取:在进行插入、更新或删除操作时,线程只需要获取对应段的锁,而不需要获取整个数据结构的锁。原创 2023-05-23 13:49:47 · 421 阅读 · 0 评论 -
Netty发送helloword以及配置使用
在上述代码中,虽然可以将请求(数据)沿着处理链传递,但每个 ChannelHandler 并没有显式地决定是否继续传递给下一个处理器,而是按照添加的顺序依次处理。ChannelPipeline 的特点是处理链中的每个 ChannelHandler 只关注自己负责的任务,通过链式调用的方式,将数据逐个传递给下一个 ChannelHandler 进行处理。总结起来,ChannelPipeline 是一个管理 ChannelHandler 的容器,负责处理和传递事件和消息,以及对数据进行处理和转换。原创 2023-05-23 00:30:57 · 174 阅读 · 0 评论 -
lecode:二分法求解平方根(中间值防治整数溢出)
在某些情况下,特别是当 l 和 r 都是较大的正整数时,(l + r) / 2 可能会导致整数溢出。为了避免这种情况,使用 l + (r - l) / 2 是一种更为保险的做法,确保计算的结果不会溢出。对于绝大多数情况,使用 (l + r) / 2 计算中间值是没有问题的,而且更简洁直观。只有在涉及到整数溢出的情况下,才需要使用 l + (r - l) / 2 这种方式来保证计算的准确性。原创 2023-05-21 16:51:11 · 258 阅读 · 0 评论 -
乐观锁和悲观锁(数据库行锁和synchronized关键字)、事务的回滚和@Transactional关键字
在方法执行前,框架会自动开启一个事务,执行方法中的业务逻辑,然后根据方法的执行结果决定是提交事务还是回滚事务。事务的回滚(Rollback)是指在事务执行过程中出现错误或异常情况时,将事务中已经执行的操作撤销,回滚到事务开始前的状态。事务的回滚是保证数据库数据一致性和完整性的重要机制,它可以保证在出现错误或异常情况时可以回滚到事务开始前的状态,避免了数据损坏和不一致的问题。行锁可以将数据库表中的特定行数据加锁,以保证在锁定期间只有一个事务能够修改或读取该行数据,其他事务需要等待锁的释放才能继续操作。原创 2023-05-19 23:02:25 · 789 阅读 · 0 评论 -
关于构造函数和volatile关键字
然后,线程在本地内存中对这个副本进行操作,修改变量的值。使用 volatile 关键字可以禁止指令重排序,保证修改变量的操作会在其他指令之前执行,并且把修改的值立即写入主内存,使得其他线程能够立即感知到该变量的变化,这样的设计是为了提高程序的运行效率,因为线程的本地内存比主内存的访问速度要快得多,而且线程的本地内存还可以减少多个线程之间的通信量,提高程序的并发性能。如果一个线程在访问一个共享变量时,另一个线程正在修改它,那么访问的线程可能无法获得该变量的最新值,甚至可能会看到一个不一致的值。原创 2023-05-19 22:57:39 · 66 阅读 · 0 评论 -
1、单例模式(饿汉模式和懒汉模式、双重锁定检测实现单例模、1式、类对象的反射机制、final的用法、Juit框架的比较方法assertEquals、AtomicInteger一种原子性整数类型。
一文学会单例模式,同步代码块后,还没有创建实例时,其他线程会一直等待。需要注意的是,这种方式虽然可以保证线程安全,但是在某些JVM环境下,由于JVM的优化等原因,可能会存在重排序问题,因此需要使用volatile关键字来防止这种问题的发生。在单线程环境中,只需要检查一次,但在多线程环境中,可能会有多个线程同时通过第一次检查,然后只有一个线程会获得锁并创建实例,其他线程需要等待。此时,计数器的值被正确的累加到了3,但是线程B在执行时读取到的计数器的值是中间状态的值2,而非最终值3,因此导致计数器的值不正确。原创 2023-05-16 12:11:08 · 128 阅读 · 0 评论