同步器
同步器同步器整体架构
六个同步器
ReentrantLock
Semaphore
CyclicBarrier
CountDownLatch
Phaser
Exchager
ReentrantLock和Synchronized异同相同点:
临界区保护(提供锁/解锁的能力)
可重入
都提供线程间的协作
Synchronized基于Monitor,monitor提供Object.wait(),Object.notify()
ReentrantLock基于AQS,提供Condition Object,提供await(), signal()等方法
提供锁升级的逻辑
Synchronized:偏向锁->轻量级锁->重量级锁
ReentrantLock:CAS竞争->休眠+排队竞争
都提供等待队列
Synchronized:monitor:entryList,waitList
ReentrantLock:CLH队列
区别点:
基于AQS vs 基于Monitor
Java生态 vs 非Java生态
Synchronized是非Java的实现
响应 ...
偏向锁_轻量级锁_重量级锁
高并发场景(EntrySet、偏向锁、轻量级锁、重量级锁)考虑大量线程竞争一个用户实现的synchronized 块,如图:
在高并发场景,竞争非常激烈。而作为语言的设计者,不能假设synchronized 的块可以迅速完成。图中很多线程竞争一个同步块,按照之前的设计,这个时候这些线程会优先考虑自旋锁。因为同步块需要10ms ,因此多数线程拿不到自旋锁。考虑到CPU执行速度非常快,每10ms 才有一个线程拿到锁。而1ms 可以执行数以10万-百万计的CAS操作。因此这样是非常不划算的:
自旋锁消耗大量计算能力(CPU资源)
大量线程进入WaitSet
这时JVM的解决方案是增加一个EntrySet。如图:
图中线程先用自旋锁竞争进入EntrySet,竞争进入EntrySet只需要少量的cas操作。
如果像图中那样用链表实现EntrySet,新线程进入EntrySet只需要两条指令,第一步创建一个节点,指向EntrySet的第一个元素。第二步,用cas操作将EntrySet的尾部指向新的节点。 这样需要的时间是非常短的,因此多数线程都可以进入EntrySet。
进入E ...
数据库架构
数据库架构如何设计一个数据库? 从如下模块出发:
为什么要使用索引?对于数据量大的表而言,查询某一条如果进行全表扫描无疑非常慢,所以需要使用索引。
通过关键信息快速定位
什么样的信息能成为索引主键、唯一键、普通键等
索引的数据结构
建立二叉树进行二分查找
建立B-Tree结构进行查找
建立B+-Tree结构进行查找
建立Hash结构进行查找
MySQL使用B+-Tree进行索引
稀疏-密集索引与搜索引擎
稀疏、密集索引与搜索引擎稀疏索引与密集索引的区别
密集索引文件中每一个搜索码值都对应一个索引值
叶子结点不仅仅保存键值,还保存有其他列的信息。
密集索引决定了物理表的排列顺序,所以一个表只创建一个密集索引,通常是主键。
稀疏索引文件只为索引码的某些值建立索引项
叶子结点仅保存了键位信息和该行数据的地址(有的稀疏索引仅保存了键位信息及其主键)。
定位到叶子结点之后仍然需要通过地址或者主键信息进一步定位到数据。
在MySQL中的具体分析主要存储引擎
MysISAM
其索引无论是主键索引还是唯一键索引或者普通索引,均为稀疏索引
InnoDB
必须有且仅有一个密集索引
如果一个主键被定义,则主键作为密集索引
如果没有主键被定义,则第一个唯一非空索引作为密集索引
若上述均不满足,InnoDB内部会生成一个隐藏主键作为密集索引
非主键索引(稀疏索引)的叶子结点并不存储行数据的物理地址,而是存储该行的主键值。
故稀疏索引包含两次查找,一次查找到主键值,第二次根据主键值找到数据
MyISAM和InnoDB索引存储对比图
InnoDB使用密集索引,将主键组织到B+ ...
慢查询sql
如何定位并优化慢SQL查询1. 根据慢日志定位慢查询sql使用SQL命令查询慢日志设置1SHOW VARIABLES LIKE '%QUERY%';
最后两个变量slow_query_log和slow_query_log_file即和慢日志有关,第一个变量控制是否开启慢日志,第二个变量定义慢日志存储位置。
超过long_query_time时间等查询会被记录在慢日志中。
开启慢查询命令打开慢查询:
1SET GLOBAL slow_query_log = ON;
设置慢查询时间:
1SET GLOBAL long_query_time = 1;
直接使用命令设置数据库重启后会还原,想要永久需要到my.cnf配置文件中去设置。
使用sql命令查询慢日志状态1SHOW STATUS like '%slow_queries%';
Slow_queries显示慢查询记录条数。
2. 使用explain等工具分析sql在命令前加explian即可分析
例如:
1EXPLAIN SELECT `name` FROM person_info_l ...
事务
事务事务四大特性
原子性
一致性
隔离性
持久性
事务隔离级别查询隔离级别:
1select @@tx_isolation
设置当前session的隔离级别为 读未提交
1set session transaction isolation level read uncommitted
事务并发引起的问题及解决方案
更新丢失
两个事务先后提交,先提交的更新丢失
mysql所有事务隔离级别均可避免此问题
脏读
一个事务读到另一个事务未提交的更新数据
READ-COMMITTED事务隔离级别以上可避免
READ-COMMITTED即只能读到已被提交的数据
不可重复读
事务B在事务A多次读取过程中修改了数据,导致多次读取数据结果不一致
REPEATABLE-READ事务隔离级别及以上可避免
幻读
事务A读取若干行,事务B删除或插入结果集
SERIALIZABLE事务隔离级别及以上可避免
InnoDB在REPEATABLE-READ事务隔离级别上避免了幻读
InnoDB如何在可重复读事务隔离界别做到避免幻读的?
表像:快照读(非阻塞读)——伪 ...
关键语法
关键语法GROUP BY根据给定数据列的每个成员对查询结果分组统计,最终得到分组汇总表
满足 : select子句中对列名必须为分组列或者列函数
列函数对于group by子句定义的每个组返回一个结果
案例:表结构:
一张表:
1234-- 查询所有同学的学号、选课数、总成绩select tudent_id,count(course_id),sum(score)from scoregroup by tudent_id
多张表:
12345678-- 查询所有同学的学号、姓名、选课数、总成绩select s.tudent_id,stu.student_name,count(s.course_id),sum(s.score)from score s student stuwhere s.student_id = stu.student_idgroup by s.tudent_id
HAVING
通常与GROUP BY子句一起使用
WHERE过滤行,HAVING过滤组
出现在同一sql中的顺序:WHERE->GROUP BY->HAVING
如果省略group ...
OSI七层网络协议模型
OSI七层网络协议模型
第一层 物理层解决两台物理机之间的交互问题,传递比特流。
主要定义了物理设备的标准 如 网线的类型、光纤的接口类型、各种传输介质的传输速率等。
将比特流转化为电流强弱进行传输,到达目的后再转化为数据流。
第二层 数据链路层第一层有错传、数据传输不完整等可能,数据链路层定义了如何格式化数据以进行传输,以及控制如何对物理介质进行访问,通常还提供错误检测和纠错,以确保数据传输的可靠性。
本层将比特数据组成了帧,交换机工作在这一层,对帧解码同时转发到对应方。
第三层 网络层将网络地址翻译成对应的物理地址,并决定如何将数据从发送方路由到接送方,网络层通过综合考虑发送优先权,网络拥塞程度,服务质量以及可选路由的花费来决定传输的最佳路径。
路由器工作在此层,此层数据称为数据包,主要关注IP协议。
第四层 传输层为保证大数据传输的准确性,需要对数据进行切分,切割为一个一个的段落,即Segment进行发送。
传输层解决了主机间的数据传输和传输质量问题,可以说是最重要的一层
进行流量控制,根据可以传输的最大尺寸将数据进行强制分割。同时对每个数据片编号,以便数据到达接收方后能 ...
TCPIP四层协议模型
TCP/IP四层协议模型
TCP协议
TCP协议IP数据包不可靠,需要又他的上层协议即TCP协议进行控制传输控制协议——TCP
面向连接的,可靠的,基于字节流的传输层通信协议。
将应用层的数据流分割成报文段并发送给目标节点TCP层
数据包都有序号,对方收到则发送ACK确认,在规定时间内(RTT确认)未收到则重传
使用校验和来检验数据在传输过程中是否有误
TCP报头
TCP三次握手
为什么需要三次握手才能建立连接?为了初始化Sequence Number的初始值
首次握手隐患——SYN超时Server收到Client的SYN,回复SYN-ACK的时候未收到ACK确认
Server不断重试直至超时,Linux默认重试五次,从一秒开始每次等待时间翻倍,等待63秒(1+2+4+8+16+32)才断开连接。
风险可能会遭到SYN Flood攻击,不停发握手请求,Linux的保护措施是SYN队列满了后,通过tcp_syncokies参数回发SYN Cookie,
如果正常链接Client会回发SYN Cookie,直接建立连接。
保活机制如果连接在保活时间处于非活动状态,server将向对方发送保活探测报文,如果未收到响 ...