- 乐观锁是一种乐观思想 , 即认为读多写少 , 遇到并发写的可能性低 , 每次去拿数据的时候都认为别人不会修改 , 所以不会上锁 , 但是在更新 的时候会判断一下在此期间别人有没有去更新这个数据 , 采取在写时先读出当前版本号 , 然后加锁操作(比较跟上一次的版本号 , 如果一样则更新) , 如果失败则要重复 , 读 比较 写的操作 。
- Java中的乐观锁基本都是通过 CAS 操作实现的 , CAS 是一种更新的原子操作 , 比较当前值跟传入值是否一样 , 一样则更新 , 否则失败 。
- 悲观锁是就是悲观思想 , 即认为写多 , 遇到并发写的可能性高 , 每次去拿数据的时候都认为别人会修改 , 所以每次在读写数据的时候都会上 锁 , 这样别人想读写这个数据就会 block 直到拿到锁 。Java中的悲观锁就是Synchronized , AQS框架下的锁则是先尝试CAS乐观锁去获取锁 , 获取不到 , 才会转换为悲观锁 , 如RetreenLock 。
- 本文里面讲的是广义上的可重入锁 , 而不是单指 JAVA 下的 ReentrantLock 。可重入锁 , 也叫 做递归锁 , 指的是同一线程 外层函数获得锁之后 , 内层递归函数仍然有获取该锁的代码 , 但不受 影响 。在 JAVA 环境下 ReentrantLock 和 synchronized 都是 可重入锁 。
- 公平锁(Fair)加锁前检查是否有排队等待的线程 , 优先排队等待的线程 , 先到先得 。
- 非公平锁(Nonfair)加锁时不考虑排队等待问题 , 直接尝试获取锁 , 获取不到自动到队尾等待
- 对比非公平锁性能比公平锁高 5~10 倍 , 因为公平锁需要在多核的情况下维护一个队列 。Java 中的 synchronized 是非公平锁 , ReentrantLock 默认的 lock()方法采用的是非公平锁 。
- Executors 工具类的不同方法按照我们的需求创建了不同的线程池 , 来满足业务的需求 。
- Executor 接口对象能执行我们的线程任务 。
- ExecutorService 接口继承了 Executor 接口并进行了扩展 , 提供了更多的方法我们能获得任务执行的状态并且可以获取任务的返回值 。使用 ThreadPoolExecutor 可以创建自定义线程池 。
- Future 表示异步计算的结果 , 他提供了检查计算是否完成的方法 , 以等待计算的 完成 , 并可以使用 get()方法获取计算的结果 。
- 数据库存储引擎是数据库底层软件组织 , 数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据 。不同的存储引擎提供 不同的存储机制、索引技巧、锁定水平等功能 , 使用不同的存储引擎 , 还可以 获得特定的功能 。现在许多不同的数据库管理系统都支持多 种不同的数据引擎 。
- 存储引擎主要有: 1. MyIsam , 2. InnoDB, 3. Memory, 4. Archive, 5. Federated。
- InnoDB底层数据结构为B+树 , B+树的每个节点对应InnoDB的一个page , page的大小是固定的 , 一般设为16k , 其中非叶子节点只有键值 , 叶子节点包含数据 。
- 适用场景经常更新的表 , 适合处理多重并发的更新请求 。支持事务 。可以从灾难中恢复(通过bin-log日志等)外键约束(只有它支持外键约束)支持自动增加列属性(auto_increment)
- MyIASM是 MySQL默认的引擎
- 优点ISAM 执行读取操作的速度很快 , 而且不占用大量的内存和存储资源 。
- 缺点不支持事务 。表级锁 , 不支持行级锁和外键 , 因此当INSERT(插入)或UPDATE(更新)数据 时即写操作需要锁定整个表 , 效率会低一些 。
推荐阅读
- 袁天罡的后人是谁 历史上有袁天罡这个人吗
- Mysql数据库实现主从同步,看这一篇就够了
- 10分钟自建企业级Docker镜像仓库!这个开源项目太顶了
- 电视机顶盒和网络机顶盒哪个好?
- Python自带爬虫库urllib使用大全
- 癫痫的前兆有哪些症状
- 如何治疗痔疮的小窍门
- 皮肤受损后该如何修复
- 西装|辣目洋子教你玩转西装穿搭,微胖女生这样穿也能在职场脱颖而出
- 老年人脚麻木吃什么药