Spring揭秘
IoC
IoC全称Inversion of Control ,翻译过来是控制反转,也可以将其称之为依赖注入。
IoC容器充当IoC Service Provider在这里的角色。从被注入对象的角度看,与之前直接寻求依赖对象相比,依赖对象的取得方式发生了反转,控制也从被注入对象转到了IoC Service Provider那里 。
Spring提供了两种容器类型: BeanFactory和ApplicationContext。
BeanFactory。基础类型IoC容器,提供完整的IoC服务支持。 默认采用延迟初始化策略( lazy-load) ,容器启动初期速度较快。
ApplicationContext。 ApplicationContext在BeanFac...
Mysql隔离机制的实现-MVCC
事务
说到数据库离不开事务这个概念,什么是事务?事物是一组操作,这些操作要么全部执行,要不全部不执行。例如汇款就是一个事务,里面包含了汇款人余额的减少和收款人余额的增加,这两件事必须保证全部都执行。
事务的特性
说到事务,必须了解其特性,这也是老生常谈的东西了
原子性:事务是最小执行单位,事务里的动作要么全部执行,要么全不执行。
一致性:执行事务的前后,数据保持一致。
隔离性:并发时,各个并发事务之间互不干扰。
持久性:事务对数据库的改变是永久的。
下面看看Mysql为了保证事务的这些特性做了哪些努力吧。
MySQL日志
Mysql内有三大日志系统:二进制日志binlog(归档日志)、事务日志redo log和回滚日志undo log。
redo l...
Mysql索引
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分)内部数据结构使用的B+树,B树节点内部包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。虽然索引能带来查询上的效率,但是维护索引的成本也是不小的。如果一个字段不被经常查询,反而被经常修改,那么就更不应该在这种字段上建立索引了。
索引分类
主键索引:数据表的主键列使用的就是主键索引。一张数据表有只能有一个主键,并且主键不能为 null,不能重复。如果建表时没有指定主键,InnoDB 会自动先检查表中是否有唯一索引且不允许存在null值的字段,如果有,则选择该字段为默认的主键,否则 InnoDB 将会自动创建一个 6Byte 的自增主键。
普通索引:又称单列...
Java锁
并发是对计算机资源的压榨,再增加资源使用率的同时也会带来一些问题,即线程安全如何保障,这就引入了互斥同步的概念。
同步指在多个线程并发访问共享数据时,保证共享数据在同一个时刻只能被一条线程使用,而互斥是实现同步的方法,临界区、互斥量和信号量都是实现互斥的方式。
Synchronized
在Java中是先互斥同步的手段是synchronized关键字。该关键字有三种主要的使用方式
修饰实例方法:给当前对象实例加锁,进入同步代码前要获得 当前对象实例的锁
修饰静态方法: 给当前类加锁,会作用于类的所有对象实例 ,进入同步代码前要获得 当前 class 的锁。
修饰代码块:需要手动指定加锁对象,可以指定类或者对象。
synchronized不同的使用方式在JVM中的...
计算机网络(TCP、HTTP)
分层模型
提到计算机网络,往往令人想到的就是协议分层模型以及不同分层中的各个协议。专家们经过讨论后提出OSI七层参考模型,但由于七层模型在实施过程中过于复杂,没有得到普及,而目前互联网普遍使用的是TCP/IP四层模型,这两种模型大致上是一致的。
TCP/IP各个分层由上而下一般称之为应用层、传输层、网络层和数据链路层。
网络层
网络层负责为分组交换网上的不同主机提供通信服务。
IP:IP协议大致分为三大作用模块,它们是IP寻址、路由(最终节点为止的转发)以及IP分包与组包。网络上每一个主机都有其唯一的ip地址,两台主机之间传输分组数据包的时候,通过目标主机的ip地址识别目标并传输。但是IP协议不具备重发机制,即使分组数据包未能到达末端主机也不会重发,因此属于非可靠性传输协...
AQS
AQS
AQS全称为AbstractQueuedSynchronizer,翻译过来就是抽象队列试同步器。它是一套多线程访问共享资源的一个同步器框架,常用实现是ReentrantLock、Semaphore、CountDownLatch等
结构
AQS内部维护两个部分
volatile int static值,也就是共享资源
FIFO的等待队列,在多线程争抢共享资源的时候存放被阻塞的线程
state的访问方式有三种:
getState()
setState()
compareAndSetState()
AQS定义两种资源共享方式:Exclusive(独占,只有一个线程能执行,如ReentrantLock)和Share(共享,多个线程可同时执行...
线程
Thread线程
线程从创建到消亡包括以下几种状态:新建(new)、运行(running)、阻塞(blocked)、等待(waiting)、超时等待(timed waiting)、终止(terminated)。
新建(New) : 创建后尚未启动的线程处于这种状态。
运行(Runnable) : 包括操作系统线程状态中的Running和Ready, 也就是处于此状态的线程有可能正在执行, 也有可能正在等待着操作系统为它分配执行时间。
等待(Waiting) : 处于这种状态的线程不会被分配处理器执行时间, 它们要等待被其他线程显式唤醒。 以下方法会让线程陷入无限期的等待状态:
没有设置Timeout参数的Object::wait()方法;
...
Redis数据结构
Redis 五种核心数据类型及其使用的数据结构
字符串 String
Redis自己构建了一种SDS(Simple dynamic string)的数据结构,用于存储字符串。
struct sdshdr{
//记录buf数组中已使用字节的数量
//等于 SDS 保存字符串的长度
int len;
//记录 buf 数组中未使用字节的数量
int free;
//字符数组,用于保存字符串
char buf[];
}
redis> SET msg "hello world"
OK
redis> APPEND msg " again!"
(integer) 18
redis> GET m...
共计 30 篇文章,4 页。