JUC-5-Java内存模型JMM
JMM 概念JVM规范中试图定义一种Java内存模型(Java Memory Model)来屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各平台下都能达到一致的内存访问效果
JMM本身是一种抽象的概念并不真实存在它仅仅描述的是一组约定或规范,通过这组规范定义了程序中(尤其是多线程)各个变量的读写访问方式并决定一个线程对共享变量的写入何时以及如何变成对另一个线程可见,关键技术占都是围绕多线程的原子性、可见性和有序性展开的
通过JMM 实现线程和主内存之间的抽象关系
屏蔽各个硬件平台和操作系统的内存访问差异以实现让Java程序在各平台下都能达到一致的内存访问效果
JMM 三大特性可见性可见性是指当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道该变更,JMM规定了所有的变量都存储在主内存中。
系统主内存共享变量数据修改被写入的时机是不确定的,多线程并发下很可能出现”脏读”,所以每个线程都有自己的工作内存、线程自己的工作内存中保存了该线程使用到的变量的主内存副本拷贝。
线程对变量的所有操作(读取,赋值等)都必需在线程自己的工作内存中进行,而不能够直接读写主内 ...
MySQL高级篇-8-索引的创建与设计原则
索引的声明与使用索引的分类 MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。
从功能逻辑上说,索引主要有 4 种,分别是普通索引、唯一索引、主键索引、全文索引。
按照物理实现方式,索引可以分为 2 种:聚簇索引和非聚簇索引
按照作用字段个数进行划分,分成单列索引和联合索引
普通索引
在创建普通索引时,不附加任何限制条件,只是用于提高查询效率。这类索引可以创建在任何数据类型中,其值是否唯一和非空,要由字段本身的完整性约束条件决定。建立索引以后,可以通过索引进行查询。
例如,在表student的字段name上建立一个普通索引,查询记录时就可以根据该索引进行查询。
唯一性索引
使用UNIQUE参数可以设置索引为唯一性索引,在创建唯一性索引时,限制该索引的值必须是唯一的,但允许有空值。在一张数据表里可以有多个唯一索引。例如,在表student的字段email中创建唯一性索引,那么字段email的值就必须是唯一的。通过唯一性索引,可以更快速地确定某条记录。
主键索引
主键索引就是一种特殊的唯一性索引,在唯一索引的基础上增加了不为空的约束,也 ...
算法提升-1-哈希表与哈希函数
自定义结构 RandomPool
请设计出一种结构,在该结构中有如下三个功能,要求其时间复杂度为 $O(1)$
insert(key):将某个 key 加入到该结构,做到不重复加入
delete(key):将原本在结构中的某个 key 移除
getRandom(): 等概率随机返回结构中的任何一个key
设计思路
设计两个哈希表 keyIndexMap 和 indexKeyMap
keyIndexMap 用来记录 key 到 index 的对应关系
indexKeyMap 用来记录 index 到 key 的对应关系
整数size初始化为0,记录Pool的大小
执行 insert(newKey),将(newKey,size)放入keyIndexMap,将(size,newKey)放入indexKeyMap,然后size自增
执行 delete(deleteKey),最新加入的key记为lastKey,对应的index信息记为lastIndex。删除的key记为deleteKey,对应的index记为deleteKey
把记录(lastKey,last ...
JUC-4-LockSupport与线程中断
线程中断机制中断机制一个线程不应由其他线程来强制中断或停止,而应该由线程自己自行停止,因此Thread.stop/suspend/resume被废弃。Java提供了一种用于停止线程的协商机制—中断,它只是一种协作协商机制,Java没有给中断增加任何语法。若要中断一个线程,你需要手动调用该线程的interrupt方法,该方法也仅仅是将线程对象的中断标识设成true;接着需要自己写代码检测当前线程的标识位,如果为true,表示别的线程请求这条线程中断。每个线程对象中都有一个中断标识位,用于表示线程是否被中断,该标识位为true表示中断,为false表示未中断。该方法可以在别的线程中调用,也可以在自己的线程中调用。
中断API
方法
说明
public void interrupt()
实例方法,仅仅设置线程的中断状态为true,发起一个协商而不会立即停止一个线程
public static boolean interrupted()
静态方法,判断线程是否被中断并清除当前中断状态;1. 返回当前线程的中断状态,测试当前线程是否已被中断;2. 将当前线程的状态状态清零,并 ...
MySQL高级篇-7-InnoDB数据存储结构
数据库的存储结构—页索引结构给我们提供了高效的索引方式,不过索引信息以及数据记录都是保存在文件上的,确切说是存储在页结构中。另一方面,索引是在存储引擎中实现的,MySQL服务器上的存储引擎负责对表中数据的读取和写入工作。不同存储引擎中存放的格式一般是不同的,甚至有的存储引擎比如Memory都不用磁盘来存储数据。
磁盘与内存交互基本单位lnnoDB将数据划分为若干个页,InnoDB中页的大小默认为16KB以页作为磁盘和内存之间交互的基本单位,也就是一次最少从磁盘中读取16KB的内容到内存中,一次最少把内存中的16KB内容刷新到磁盘中
数据库管理存储空间的基本单位是页,数据库IO操作的最小单位是页。一个页中可以存储多个行记录。在数据库中,不论读一行,还是读多行,都是将这些行所在的页进行加载。
记录是按照行来存储的,但是数据库的读取并不以行为单位,否则一次读取(即一次IO操作)只能处理一行数据,效率比较低
页结构概述页a、页b、页c..页n这些页可以不在物理结构上相连,只要通过双向链表相关联即可。每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表,每个数据页都会为存储在它里边 ...
JVM 内存与垃圾回收篇-7-StringTable
String的基本特性
String:字符串,使用一对""引起来表示
12String s1 = "cyan"; // 字面量定义String s2 = new String("cyan")
String 声明为final的,不可被继承
String 实现了Serializable接口:表示字符串是支持序列化的
String 实现了Comparable接口:表示string可以比较大小
String 在jdk8及以前内部定义了final char[ ] value用于存储字符串数据。jdk9时改为byte[]
String:代表不可变的字符序列,即不可变性。
当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值
当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
当调用String的replace ()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
通过字面量的方式(区别于new)给一个字符串赋值, ...









