MyBatis 中使用枚举
问题
在编码过程中,经常会遇到用某个数值来表示某种状态、类型或者阶段的情况,比如有这样一个枚举:
1 | public enum ComputerState { |
通常我们希望将表示状态的数值存入数据库,即 ComputerState.OPEN 存入数据库取值为 10。
在编码过程中,经常会遇到用某个数值来表示某种状态、类型或者阶段的情况,比如有这样一个枚举:
1 | public enum ComputerState { |
通常我们希望将表示状态的数值存入数据库,即 ComputerState.OPEN 存入数据库取值为 10。
文件是进程创建的信息逻辑单元,每个文件是独立于其他文件的,是对磁盘的建模,而非对 RAM 的建模。
如果能把每个文件看成一个地址空间,那么就能理解文件的本质了。
深入理解计算机系统使用指南:https://book.douban.com/review/5627139/
操作系统所处的位置
硬件包括芯片、电路板、磁盘、键盘、显示器以及类似的设备。
用户态和内核态
多数计算机有两种运行模式:内核态和用户态。
把共享数据的可见范围限制在同一个线程之内,这样,无须同步也能保证线程之间不出现数据争用的问题
概述: 用来控制一个线程等待多个线程
原理:
维护了一个计数器 cnt,每次调用 countDown () 方法会让计数器的值减 1,减到 0 的时候,那些因为调用 await () 方法而在等待的线程就会被唤醒
API:
实例:
1 | public class CountdownLatchExample { |
场景:
不足:
CountDownLatch 是一次性的,计数器的值只能在构造方法中初始化一次,之后没有任何机制再次对其设置值,当 CountDownLatch 使用完毕后,它不能再次被使用。
处理器如何实现原子操作
处理器提供 总线锁定 和 缓存锁 定两个机制来保证复杂内存操作的原子性。
底层用 lock 实现,如果是多核添加 lock 指令。
lock 用于在多处理器中执行指令时对共享内存的独占使用。
它的作用是能够将当前处理器对应缓存的内容刷新到内存,并使其他处理器对应的缓存失效
另外还提供了有序的指令无法越过这个内存屏障的作用
volatile 变量自身具有以下特性:
想了解以上特性的原理,需先了解 [处理器缓存](#0. 处理器缓存)。
自旋锁的思想是让一个线程在请求一个共享数据的锁时执行忙循环(自旋)一段时间,如果在这段时间内能获得锁,就可以避免进入阻塞状态
缺点: 如果某个线程持有锁的时间过长,就会导致其它等待获取锁的线程进入循环等待,消耗 CPU。使用不当会造成 CPU 使用率极高。