自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(129)
  • 收藏
  • 关注

原创 chapter01_MySQL架构_3_事务

ACID定义(1) 原子性一个事务是一个单独的内部不可分的工作单元(2) 一致性数据库总是从一种一致性状态转换到另一种一致性状态(3) 隔离性某个事务的结果只有在完成以后才对其他事务可见(4) 持久性一旦一个事务提交,事务所做的数据改变将是永久的事务将导致数据库服务器要完成更多的额外工作隔离级别(1) 四个隔离级别1° READ UNCOMMITED2° READ...

2019-03-31 21:11:04 96

原创 chapter01_MySQL架构_2_并发控制

并发控制出现在__服务器层__(第1层)和__存储引擎层__(第3层)读锁:共享写锁:排他锁粒度减小锁粒度的__好处__:允许更多的并发修改,只要它们不冲突坏处:消耗系统资源(获得锁、检查锁、释放锁等步骤)表锁(1) 既可以由MySQL本身管理,也可以由存储引擎管理(2) 开销最小的策略是表锁(3) 等待策略是__写者优先__:被申请的写锁可以插队行锁(1...

2019-03-31 09:16:38 97

原创 chapter01_MySQL架构_1_MySQL的逻辑架构

MySQL的逻辑架构(1) __第一层__包括了连接处理、授权认证、安全等服务器负责__缓存__线程,所以不是每个新的连接都要开/撤新线程(线程池)(2) __第二层__是MySQL的核心内容,包括查询解析、分析、优化、缓存、内建函数等__查询缓存__会保存已有的查询结果,如果再次查询就直接返回缓存的结果;分析器__会解析查询,创建内部__解析树;__优化器__会进行优化(3)...

2019-03-31 09:05:18 195

原创 11_Java反射机制

Class类(1) 位于 java.lang 下(2) JavaDoc的介绍1° Class代表类的类或者接口的类(enum是一种类,注解是一种接口)2° Class类没有public构造器,所以Class类的对象实例时由JVM自动在类被加载时构造出来的3° 获取对应的Class实例的方法: 如果是对象,则可以用 对象.getClass()方法获得(getClass()方法是Obje...

2019-03-24 15:10:09 167

原创 4_SpringAOP实现机制

代理模式(1) 代理模式下一共有4种角色1° Subject接口 —> 用户访问的超类型2° SubjectImpl类 —> Subject接口的实现类3° SubjectProxy类 —> SubjectImpl的代理类4° Client —> 访问Subject的用户,它不在乎Subject接口的具体实现,只要是Subject超类型即可静态代理(1...

2019-03-23 20:01:38 123

原创 chapter06_死锁_5_处理死锁的策略(三)死锁避免

避免死锁的算法是__存在的__, 但是__前提__是事先已经获得了进程要获取资源的全部信息(1) 安全状态当死锁没有发生时, 即使所有进程突然请求对资源的最大需求, 也仍然存在某种调度次序, 使得每一个进程都可以运行完毕(2) 不安全状态当死锁没有发生时, 不存在某种调度次序, 使得每一个进程都可以运行完毕单个资源的银行家算法(1) 基本思想对每一个资源请求进行__检查_...

2019-03-22 15:46:24 130

原创 chapter06_死锁_4_处理死锁的策略(二)死锁检测和恢复

每种类型的资源__只有一个__时的死锁检测(1) 画出所有进程、所有资源的__资源分配图(2) 检测资源分配图(有向图)中是否出现环路(3) 有向图检测环路算法有很多种每种类型的资源__有多个__时的死锁检测(1)设有n个进程, m种资源 E(1*m) = (E1,E2,..., Em)代表每种资源的个数 A(1*m) = (A1,A2,..., Am)代表每种资源可...

2019-03-22 15:34:13 352

原创 chapter06_死锁_3_处理死锁的策略(一)忽略死锁

鸵鸟算法(1) 死锁问题很少发生时,就当它不存在,出现问题时再说(2) 这样性能会提升不少,因为为了防止死锁或恢复死锁要引入很多额外的复杂操作...

2019-03-22 15:17:49 431

原创 chapter06_死锁_2_死锁概述

死锁(1) 定义如果一个进程集合中,每个进程都在等待只能由该集合中的其他进程才能引发的事件, 那么该进程集合__死锁__(2) 分类1° 资源死锁: 等待的事件是释放该进程集合中其他进程所占有的资源2° 通信死锁: 一组通信进程都在等待其他进程传递的消息,而由于某种原因通信信道为空且没有超时机制(3) 资源死锁是死锁最常见的类型。资源既可以是硬件资源(如打印机、CD-ROM),也可...

2019-03-22 15:16:40 100

原创 chapter06_死锁_1_资源

资源的一种分类(1) 可抢占资源: 可以从拥有它的进程中抢占而不产生其他副作用例如: 存储器(2) 不可抢占资源: 不引起相关的计算失败的情况下,无法把它从占有它的进程处抢占过来例如: 光盘刻录机但是打印机比较特殊,物理打印机本身是不可抢占资源,但是假脱机打印是可抢占资源死锁和不可抢占资源相关,因为可抢占资源直接抢就是了,不是必须要等有时,请求资源的__顺序__可能会导致...

2019-03-22 15:13:04 130

原创 chapter02_进程与线程_3_进程(线程)间通信

进程通信的三个问题(1) 一个进程如何把信息传递给其他进程(2) 如何确保多个进程活动时不会出现交叉(3) 如果进程间需要按顺序进行,如何保证进程执行的顺序线程通信的两个问题(1) 由于多线程共享同一地址空间,所以不存在问题(1),但是问题(2)和(3)都存在(2) 接下来讨论解决进程通信三个问题的方法,但是方法对于线程通信也适用竞争条件(1) 定义多个进程读写某些共...

2019-03-22 11:59:02 147

原创 chapter02_进程与线程_5_生产者-消费者问题

方法一:使用Semaphore解决思路:设置两个信号量availableItems和availableSpaces,每次put和take之前先尝试获取对应的信号量(down操作),获取不到就阻塞;获取到了调用底层的两个受this锁保护的doInsert和doExtract方法,在这两个方法中会将对应的信号量做up操作 @ThreadSafe public class Semaphor...

2019-03-22 10:19:08 162

原创 chapter02_进程与线程_4_调度

许多适用于进程调度的算法也适用于线程调度,因此一并来讨论进程切换的代价比较高,需要__从用户态切换到内核态__,并且要__保存当前进程的状态__进程的分类计算密集型: 绝大多数时间花费在计算上IO密集型: 绝大多数时间花费在等待IO上随着CPU速度的提高,越来越多的进程由计算密集型转化为IO密集型需要进行调度的时机1° 创建一个新的进程后2° 一个进程退出后3° ...

2019-03-22 09:46:57 116

原创 chapter02_进程与线程_2_线程

使用多线程的原因(1) 一个应用进程中可能发生多种活动,有些活动可能会被阻塞,多线程可以简化程序设计(2) 线程比进程__轻量__,创建、撤销、转换线程的开销都更小(创建、撤销进程的开销包括分配和回收资源,切换进程的开销包括保存当前进程CPU状态和设置新进程CPU状态,而切换线程只需要保存少量寄存器)(3) 如果应用中存在大量IO操作,使用多线程可以加快应用程序的执行速度(如果应用程序是...

2019-03-22 09:43:25 96

原创 chapter02_进程与线程_1_进程

(1) 在任意一个瞬间,一个CPU只能运行一个进程;但是CPU可以由一个进程快速切换至另一个进程,使每个进程各运行几十或几百ms。(2) 对于多核CPU,每个处理器在任意一个瞬间也只能运行一个进程(3) 单个处理器可以被若干进程共享,使用__调度算法__决定何时停止一个进程的工作转向另一个进程(1) 一个进程就是一个正在执行程序的实例(2) 两个进程恰好运行同一个程序时,仍然属于两...

2019-03-22 09:39:29 102

原创 8_ST表

全名叫Sparse Table这种数据结构针对的应用场景是数组固定、频繁查询一定范围内数组的最小/最大值。由于查询是频繁的,所以要考虑使用表来预存储信息。常规的想法是存储所有从i到k范围内的最小值,这样查询的时间复杂度是O(1),但是建表的时间复杂度是O(n^2)。那ST表的做法是想办法将建表复杂度从O(n2)降到O(nlogn)。为了完成这一操作,需要考虑将区间长度每次二分,这样就会...

2019-03-21 18:45:08 95

原创 chapter16_Java内存模型_3_初始化过程中的安全性

对于含有final域的对象, 初始化安全性可以防止对对象的初始引用被重排序到构造过程之前。当构造函数完成时, 构造函数对final域的所有写入操作, __以及对通过这些域可以到达的任何变量__的写入操作都将被冻结, 并且任何获得该对象引用的线程都至少能确保看到被冻结的值。 @ThreadSafe public class SafeStates { private fin...

2019-03-20 19:54:36 161

原创 chapter16_Java内存模型_2_发布

造成不安全发布的__根本原因__是"发布一个共享对象"和"另一个线程访问该对象"之间缺少偏序关系(1) 静态初始化器__是由JVM在类的初始化阶段执行, 即__类被加载后并且被线程使用之前(2) 在静态初始化期间, 内存写入操作将自动对所有线程可见, 因此__无论是在被构造期间还是被引用时, 静态初始化的对象都不需要显示的同步__(3) 示例 @ThreadSafe pub...

2019-03-20 19:54:28 73

原创 chapter16_Java内存模型_1_什么是内存模型及为什么需要它

底层中出现一些的问题(1) 编译器中生成的指令顺序, 未必与源代码中的顺序相同(2) 编译器会把变量保存在寄存器而非内存中(3) 处理器可以乱序或并行执行指令(4) 缓存可能会改变将写入变量提交到主内存的次序(5) 保存在处理器本地缓存中的值, 对于其他处理器是不可见的JVM保证的__偏序关系__(1) 程序顺序规则如果程序中操作A在操作B之前, 那么当前线程中A操作将在B...

2019-03-20 19:54:16 93

原创 chapter15_原子变量与非阻塞同步机制_4_非阻塞算法

原子变量的compareAndSet操作__既能提供原子性, 又能提供可见性__ public class AtomicInteger extends Number implements java.io.Serializable { ... private static final jdk.internal.misc.Unsafe U = jdk.interna...

2019-03-20 19:54:05 75

原创 7_二叉树的非递归遍历

TreeNode类 class TreeNode { TreeNode left; TreeNode right; int value; public TreeNode(int value) { this.value = value; } }实现 class TraverseNonRecur...

2019-03-20 19:53:45 118

原创 chapter15_原子变量与非阻塞同步机制_3_原子变量类

(1) 原子变量比锁性能更高(2) 原子变量支持volatile的语义示例 @ThreadSafe public class CasNumberRange { @Immutable private static class IntPair { // INVARIANT: lower <= upper fi...

2019-03-19 16:10:19 80

原创 chapter15_原子变量与非阻塞同步机制_2_硬件对并发的支持

独占锁synchronized是一项__悲观__技术, 它假设最坏的情况CAS(1) 全名 Compare and Swap(2) 是一项__乐观__技术(3) CAS包含__3个__操作数1° 需要读写的内存位置V2° 进行比较的值A3° 准备写入内存的新值B(4) 具体操作当且仅当位置V的值等于A时, CAS才会通过__原子方式__将B写入V的位置, 否则不执行任何操...

2019-03-19 15:54:53 70

原创 chapter15_原子变量与非阻塞同步机制_1_锁的劣势

内置锁的特性无论哪个线程持有守护变量的锁, 它都可以用独占的方式来访问这些变量, 并且对变量的任何修改对随后获得这个锁的线程都可见多个线程同时请求锁时会发生的现象(1) 一个线程获得锁, 其他线程被挂起并且在稍后恢复运行(2) 当线程恢复运行时, 必须等待其他线程执行完它们的时间片, 才会被调度结论: 在挂起和恢复线程时存在巨大的开销volatile的机制(1) 使用vo...

2019-03-19 15:20:07 64

原创 chapter15_原子变量与非阻塞同步机制_0_绪论

java.util.concurrent包中的许多类(例如Semaphore), 都提供了比synchronized机制更高的性能和可伸缩性, 性能提升的内在原因是: 原子变量AtomicXXX 和 非阻塞的同步机制非阻塞算法优点: 可伸缩性强、活跃性好(不存在死锁和其他活跃性问题)缺点: 实现复杂原子变量AtomicXXX(1) 提供了和volatile类型变量相同的内存语...

2019-03-19 15:14:06 121

原创 chapter14_构建自定义的同步工具_5_AbstractQueuedSynchronizer

ReentrantLockSemaphore与CountDownLatchFutureTaskReentrantReadWriteLock

2019-03-19 15:08:35 116

原创 chapter14_构建自定义的同步工具_5_AbstractQueuedSynchronizer

(1) 在基于AQS构建的同步器类中, 最基本的操作是各种形式的__获取__操作和__释放__操作(2) 获取操作是一种__依赖状态__的操作, 并且通常会阻塞(3) 获取操作包括两个子操作:1° 同步器判断当前状态是否允许获得操作2° 更新同步器的状态各种同步器(ReentrantLock, Semaphore等)的区别其实本质上就是这两个操作的实现方式不一样(4) 释放操作不是...

2019-03-19 15:07:55 74

原创 chapter14_构建自定义的同步工具_4_Synchronizer剖析

(1) 很多同步工具内部都__使用了__AbstractQueuedSynchronizer(AQS)(2) 基于AQS构建同步工具可以减少实现工作, 而且不必处理在多个位置上发生的竞争问题(3) ReentrantLock, Semephore, CountDownLatch, FutureTask等内部都用到了AbstractQueuedSynchronizer的实现类...

2019-03-19 15:06:52 96

原创 chapter14_构建自定义的同步工具_2_使用条件队列

条件队列可以构建高效、高响应性的状态依赖类(wait时自动挂起, 不用像轮询方式一样费尽心机的选择sleep时间), 但是__容易不正确使用__所以, 如果可能的话, 还是__尽可能用LinkedBlockingQueue, Latch, Semephore, FutureTask等__条件谓词(1) 定义使某个操作成为状态依赖操作的前提条件例如, BlockingQueue的t...

2019-03-19 14:51:26 150

原创 chapter14_构建自定义的同步工具_1_状态依赖性的管理

轮询方式(1) 基类 @ThreadSafe public abstract class BaseBoundedBuffer<V> { @GuardedBy("this") private final V[] buf; @GuardedBy("this") private int tail; @Guarde...

2019-03-19 14:51:15 131

原创 chapter14_构建自定义的同步工具_3_显式的Condition对象

(1) Condition是一种广义的条件队列(2) 在java.util.concurrent.locks包中, Condition是一个接口 public interface Condition { void await() throws InterruptedException; void awaitUninterruptibly(); l...

2019-03-19 14:49:53 148

原创 chapter13_显式锁_5_读写锁

(1) ReadWriteLock是一个接口 public interface ReadWriteLock { /** * Returns the lock used for reading. * * @return the lock used for reading */ Lock readLock(); ...

2019-03-18 20:46:00 111

原创 chapter13_显式锁_4_在synchronized和ReentrantLock之间选择

根据"2_性能考虑因素.md", 通过性能做出选择很不稳(1) 内置锁的优势1° 历史遗留2° 不需要显式unlock3° 线程转储中, JVM可以知道哪些线程持有哪些内置锁, 但是不知道持有哪些ReentrantLock(2) ReentrantLock的优势1° 功能丰富可定时可轮询可中断(3) 所以, 如果内置锁可以满足需求, 就用synchronized; 如果...

2019-03-18 20:40:27 83

原创 chapter13_显式锁_3_公平性

(1) 在ReentrantLock的构造函数中可以指定创建公平性的锁还是非公平性的锁 /** * Creates an instance of {@code ReentrantLock} with the * given fairness policy. * * @param fair {@code true} if this lock should use a ...

2019-03-18 20:05:26 90

原创 chapter13_显式锁_2_性能考虑因素

ReentrantLock和synchronized到底谁的性能好?随着Java版本的迭代, 它们之间性能比较的结果不太稳, 有的时候ReentrantLock好, 有的时候synchronized好

2019-03-18 20:01:48 80

原创 chapter13_显式锁_1_Lock与ReentrantLock

(1) Lock是一个接口, 它提供了一种无条件的、可轮询的、定时的、可中断的锁获取操作m 所有加锁和解锁的方法都是__显式__的 public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock();...

2019-03-18 19:59:30 88

原创 chapter12_并发程序的测试_4_其他的测试方法

测试的目标不是为了更多的发现错误, 而是提高代码能按照预期方式工作的可信度(1) 代码审查CodeReview(2) 静态分析工具: 它们不需要运行代码, 是在分析代码中是否存在常见的错误模式, 例如FindBugs软件常见的能被静态分析出来的问题1° 不一致的同步使用了不同的锁2° 调用了Thread.run()3° 显示锁没有被释放4° 空的同步块5° 双重检查加锁...

2019-03-18 19:35:59 97

原创 chapter12_并发程序的测试_3_避免性能测试的陷阱

垃圾回收(1) 垃圾回收的时序无法预测所以会导致有时测出的执行时间由于GC的影响而导致不准(2) 应对GC造成的测量时间误差的策略1° 确保GC操作在测试期间不会运行用-verbose查看JVM运行时是否GC过2° 确保GC操作在测试期间执行过多次这种方式比较靠谱, 因为它比较像真实的运行环境动态编译(1) JIT技术导致测试的时间既有可能是解释执行的时间, 也有可能是编...

2019-03-18 19:35:50 249

原创 chapter12_并发程序的测试_2_性能测试

尽量模拟被测试对象在应用程序中的实际用法吞吐率单位时间内处理的任务数量根据P217的图, 当增加更多的线程时, 吞吐率可能会有所下降, 因为没有足够多的CPU用于计算, 大部分时间耗在了线程的阻塞和解除阻塞上面java.util.concurrent中的算法已经通过无数的测试进行了调优, 性能达到了我们已知的最佳状态, 所以要尽可能使用已有的库满足我们的需求信号量可以...

2019-03-18 19:35:42 95

原创 chapter12_并发程序的测试_1_正确性测试

正确性测试(0) 要测试的类SemaphoreBoundedBuffer.java @ThreadSafe public class SemaphoreBoundedBuffer&lt;E&gt; { private final Semaphore availableItems, availableSpaces; @GuardedBy("this") ...

2019-03-18 19:35:33 337

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除