TA的博客

143

一、索引的概念1、什么是索引?MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。从官方的定义可以得到索引的本质:索引是数据结构,可以简单理解为索引就是一种数据结构,它可以帮助我们快速的从数据库查询到数据。索引就类似于一本书的目录,通过目录可以快速找到需要查找对内容。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向...

一、整体架构图和其它数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。这种架构可以根据业务的需求和实际需要选择合适的存储引擎。MySQL官方给出的系统逻辑架构分为4层,如下图所示:这四层自顶向下分别是连接层,服务层(核心层),存储引擎层,系统文件层。我们自顶向...

一、Java集合框架体系总览总的来说,Java集合框架以Collection接口为中心,下属是三个子接口,分别是:List(线性表)、Set、Queue(队列),以及还有一个非常重要的Map接口。下面我们分别总结一下每种类型集合下的知识点。Collection接口首先我们来看一下Collection接口中的方法:Iterable接口Collection接口继承了Iterable接口,说明所有...

队列是一种访问受限的线性数据结构,它有两个基本操作:在队列尾部加入元素和从队列头部移除元素。在我们日常开发中,经常用来并发操作数据。java中提供了一些应用比较广泛的特殊队列:一种是以ConcurrentLinkedQueue为代表的非阻塞队列;另一种是以BlockingQueue接口为代表的阻塞队列。一、初识阻塞队列在J.U.C包中提供的BlockingQueue很好的解决了多线程中如何高...

CopyOnWriteArrayList是J.U.C包下的一个并发容器,它是线程安全且读操作无锁的ArrayList,写操作(增删改)则通过将底层数组拷贝一份,更改操作全部在新数组上进行,是一种读写分离的并发策略,我们也可以称这种容器为"写时复制器",Java并发包中类似的容器还有CopyOnWriteArraySet。本文会对CopyOnWriteArrayList的实...

一、ConcurrentLinkedQueue简介在Java开发个过程中我们不可避免的会使用到一些集合类,比如ArrayList、HashMap等,这些集合类型在多线程环境下使用会有线程安全问题。虽然不同的集合类型都有他的线程安全版本,比如ArrayList不是线程安全的,Vector是线程安全。而保障Vector线程安全的方式,是非常粗暴的在方法上用synchronized独占锁,将多线程...

HashMap在多线程环境下有线程安全问题,因此在多线程环境下不要直接使用HashMap,而是使用下面几种不同的方式去代替:(1)使用ConcurrentHashMap(2)使用Hashtable(3)使用Collections.synchronizedMap(Mapmap)方法将HashMap包装成一个线程安全的集合不过鉴于要保证多线程环境下程序的并发度,后两种方案直接Pass,因为他们保...

声明:基于jdk1.8源码。一、认识HashMapHashMap最早在jdk1.2就出现了,直到jdk1.7都没有太大的改动:jdk1.7的采用的存储结构是采用了数组+链表,jdk1.8的存储结构数组+链表+红黑树HashMap允许存储一个键和值都为null的元素(这一点Hashtable不可以),HashMap在多线程环境下没法保证对元素的操作是线程安全的。下面我们就来一步步分析,并针对特...

在JDK的并发中提供了几个非常有用的并发工具类:CountDwonLatch、CyclicBarrier、Semaphore。下面我们就一起了解一下这些类的基本使用以及基本原理吧。PS:最起码你得知道它们是干什么用得,下面列出得代码也建议你跑跑。其实如果你理解AQS的设计原理的话,这些工具类的原理就不难理解了。一、闭锁CountDwonLatchCountDownLatch允许一个或多个线程...

一、从Lock接口说起锁时用来控制多个线程范文共享资源,保证资源安全性的一种重要手段。在Lock接口出现以前,Java陈旭是靠synchorinzed关键字实现锁功能点的,在jdk1.5之前使用synchroinzed绝对是一个重量级的操作,因为synchroinzed是依赖对象锁实现的,而对象锁(ObjectMonitor)又依赖底层操作系统的mutexlock指令,这个指令需要操作系统在...

AQS概述AQS是AbstractQueuedSynchorinizer的简写,中文名是队列同步器。AQS是Java实现阻塞式锁和同步工具的基石。它使用一个int类型的成员变量表示同步状态,通过内置的一个FIFO队列完成资源获取线程的排队工作。AQS是一个抽象类,主要是通过继承的方式来使用,它本身没有实现任何的同步接口,仅仅是定义了同步状态的获取以及释放的方法来提供自定义的同步组件。一、AQ...

如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?在Java中可以通过线程池来达到这样的效果。今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPoolExecutor类中的方法...

前言​Unsafe为我们提供了访问底层的机制,这种机制仅供java核心类库使用,而不应该被普通用户使用。其实例一般情况是获取不到的,源码中的设计是采用单例模式,不是启动类加载器加载初始化就会抛SecurityException异常。​这个类的提供了一些绕开JVM的更底层功能,基于它的实现可以提高效率。但是,它是一把双刃剑:正如它的名字所预示的那样,它是不安全的,它所分配的内存需要手动free...

高性能原子类是java8中增加的原子类,它们使用分段的思想(Cell[]),把不同的线程hash到不同的段上去更新,最后再把这些段的值相加得到最终的值,相对Atomic类这些类运行性能更高,这些类主要有:(1)Striped64:下面四个类的父类。(2)LongAccumulator:long类型的聚合器,需要传入一个long类型的二元操作,可以用来计算各种聚合操作,包括加减乘除模。(3)L...

AtomicStampedReference是Java提出的一个原子类,它可以解决ABA问题。与这个类有同样作用的类是AtomicMarkableReference,他们都可以解决CAS的ABA问题。一、什么是ABA问题?ABA的危害?ABA问题发生在多线程环境下,说的是当线程A对一个变量使用CAS修改的时候,他两次读到内存地址V中的值一样,然后改线程就简单的认为变量没有发生过修改。然而,同...