主页

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...

阅读更多