一、控制反转(IoC)和依赖注入(DI). 控制反转 Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建。
谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
这里提到的“外部资源”指的是IoC(Inversion of Control,控制反转)容器之外的资源。
为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象(new关键字),也就是正转;而反转则是由容器来帮忙创建及注入依赖对象。
为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
. 依赖注入. ...
前言MVCC是面试重灾区,网上的内容我发现并不全面,只有生搬硬套下来的原理却不解释过程,让我看的云里雾里。我写这篇MVCC的内容目的是能更好了理解MVCC如何实现,结合一些八股的内容和实际的案例进行介绍,全程干货。
一、什么是MVCC多版本并发控制(MVCCD;Multi-Version Concurrency Control),是一种用来解决读 - 写冲突的无锁并发控制。也就是为事务分配单向增长的时间戳,为每个修改保存一个版本。版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照(复制了一份数据)。mvcc解决的就是读写时的线程安全问题,线程不用去争抢读写锁(读写锁可参考:Java多线程:三、多线程锁、java锁的实现 | 颓废市民黄先生 (rengoku.top))。
说到读写冲突和多线程并发控制,肯定也会涉及事务的隔离级别,即读未提交(可能脏读),读已提交(不可重复读),可重复读(可能幻读)。
MVCC所提到的读是快照读,也就是普通的select语句。快照读在读写时不用加锁,不过可能会读到历史数据。
还有一种读取数据的方式是当前读,是一种悲观锁的操作。它会对当前 ...
MySQL中的锁,按照锁的粒度分,分为:
全局锁:锁定数据库中所有表
表级锁:每次操作锁整张表
行级锁:每次操作锁住对应行数据
一、全局锁
mysqldump相信大家都听说过,这是用来进行数据库备份的工具,除此以外也可以采用数据库主从复制机制进行数据库备份,这同时也是异地容灾、备份等内容。
数据库备份操作:
# 加锁操作flush tables with read lock;# 数据备份mysqldump -uroot -p databases > database.sql# 加端口的数据备份mysqldump -h..xx.xx -uroot -p databases > database.sql# 解锁操作unlock tables;
这里附上一篇flush操作的博客,用的是博客中的第条:MySQL flush命令详解-CSDN博客
FLUSH TABLES: 关闭所有表并清空表缓存(如查询缓存),或者指定特定表进行刷新。这对于解决锁问题、确保数据一致性或在没有重启MySQL服务的情况下应用表结构更改很有用 ...
一、存储引擎. InnoDB在MySQL现版本,默认的存储引擎是InnoDB,这个不用多说了,另外常见的还有MyISAM,Memory,CSV等,这里就InnoDB进行介绍。
总结成三个词语就是:事务,外键,行级锁。
. idb文件-表空间文件
*.frm:与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等
*.ibd:InnoDB DATA,表数据,表结构和索引的文件。该表的索引(B+树)的每个非叶子节点存储索引,叶子节点存储索引和索引对应的数据。
要是想查看这个表,直接打开的话是不行的,因为都是二进制文件
可以通过ibdsdi xx.ibd命令来得到json格式的表数据
. 逻辑存储结构
二、架构. 内存架构
buffer pool处理主键索引、二级索引,而change buffer是基于为了减少磁盘io的目的,优化了二级索引处理。
利用哈希索引去做查操作非常的快,而使用b+树的效率和使用hash索引相比就没有那么高,因此在innodb中优化了对buffer pool的查询。如果hash索引更快则建立hash索引,和之前学的一样,和b+树都是一种 ...
一、 什么是索引?索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址,可以大大加快查询的速度,使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据。索引的作用类似于书的目录,可以根据目录中的页码快速找到所需的内容。
. 索引概述(了解)当数据保存在磁盘类存储介质上时,它是作为数据块存放。这些数据块是被当作一个整体来访问的,这样可以保证操作的原子性。硬盘数据块存储结构类似于链表,都包含数据部分,以及一个指向下一个节点(或数据块)的指针,不需要连续存储。
记录集只能在某个关键字段上进行排序,所以如果需要在一个无序字段上进行搜索,就要执行一个线性搜索(Linear Search)的过程,平均需要访问 N; 的数据块,N 是表示所占据的数据块数目。如果这个字段是一个非主键字段(也就是说,不包含唯一的访问入口), 那么需要在 N 个数据块上搜索整个表格空间。
但是对于一个有序字段,可以运用二分查找(BinarySearch),这样只需要访问 log(N)的数据块。这就是为什么数据表使用索引后性能 ...
前言据我看到的面试题有:判断垃圾回收的算法有什么,以及是什么原理,垃圾收集算法有什么,常见的垃圾回收器有什么,什么是STW等,所以这篇博客基于GC给大家介绍,如果有其他面试题可以在评论区发言,博客可修改内容,可添加。
一、判断垃圾回收的算法先提前说两个算法,分别是:
引用标记算法
可达性分析算法
.引用标记算法引用标记算法是在Java对象头(Java对象头在介绍多线程的时候有详细的解释,直达链接:Java多线程:三、多线程锁、java锁的实现)中开辟空间,记录被引用的次数(Reference Count),如果A变量被其他对象引用时计数器+,引用A变量的其他变量被删除则-,如果计数器为时,则判断A变量需要被回收。
举个例子:
String str = "我不想上早八";
此时,在Java虚拟机栈(以下简称栈)开辟一个内存空间记录str,此时堆中的字符串常量池的“我不想上早八”,被引用的次数就是(Reference CountD;),此时我做修改操作:
String str = "其实我想上早七";
此时,在栈中 ...
一、JDK .. 加锁机制ConcurrentHashMap 在 JDK . 中,提供了一种粒度更细的加锁机制,这种机制叫分段锁「Lock Striping」。整个哈希表被分为多个段,每个段都独立锁定。读取操作不需要锁,写入操作仅锁定相关的段。这减小了锁冲突的几率,从而提高了并发性能。
这种机制的优点:在并发环境下将实现更高的吞吐量,而在单线程环境下只损失非常小的性能。
可以这样理解分段锁,就是将数据分段,对每一段数据分配一把锁。当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。
有些方法需要跨段,比如 size()、isEmpty()、containsValue(),它们可能需要锁定整个表而不仅仅是某个段,这需要按顺序锁定所有段,操作完后,再按顺序释放所有段的锁。如下图:
. jdk.之前的结构ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组+链表构成的。Segment 是一种可重入的锁 ReentrantLock,HashEntry 则用于存储键值对数据。
一个 ConcurrentHas ...
前言大部分内容由网上搜索,有直接复制粘贴的内容,本篇博客整理我查找的内容,且加入我个人的理解和个人需要了解的知识进行搜索得到的内容,有错误请在评论区留言
一、首先介绍一下锁操作系统层面的锁: 操作系统通过锁机制来管理进程(或线程)对共享资源的访问,以防止数据竞争和保证数据一致性。 常见的操作系统锁包括互斥锁(Mutex)、读写锁(Read-Write Lock)、自旋锁(Spinlock)等,它们用于控制对临界区(Critical Section)的访问。
这里介绍一下“临界区”的概念。所谓“临界区”,指的是某一块代码区域,它同一时刻只能由一个线程执行。
Java多线程的锁: Java中的锁是Java编程语言中用于实现多线程同步和互斥的机制。 Java提供了多种类型的锁,如synchronized关键字、ReentrantLock类、ReadWriteLock等,用于控制多线程对共享资源的并发访问。
首先需要明确的一点是:Java 多线程的锁都是基于对象的,Java 中的每一个对象都可以作为一个锁。在上一节最后一点讲synchronized的时候有提到,synchronized可 ...
文章包括八股的JMM模型、volatile关键字、synchronized关键字、重排序等内容,来,试试看~
Java开发未读
Java多线程:(一)线程池全文干货了解线程池,知道java面试中线程的内容会问什么