可重入锁
锁框架
基于抽象基类的设计模式,抽象基类是AbstractQueuedSynchronizer
AbstractQueuedSynchronizer
抽象基类里提供了获取不到锁时的等待队列,并在锁释放时唤醒等待队列中的下一个线程
成员变量
volatile 变量state
获取锁
把tryAcquire交给子类去重载,真正的尝试获取逻辑交给子类,抽象基类只做在获取锁失败加入队列。 在这个方法中也可以用来实现公平和非公平锁.
对于队列的并发操作和非阻塞队列的流程类似
acquire
1 | public final void acquire(int arg) { |
支持中断的acquire
1 | public final void acquireInterruptibly(int arg) |
获取共享锁
1 | public final void acquireShared(int arg) { |
释放锁
release
唤醒队列中后续节点
1 | public final boolean release(int arg) { |
可重入锁
tryAcquire的重载
1 | static final class FairSync extends Sync { |
x86体系结构
Posted on
In
计算机体系结构
x86实模式
x86实模式的内存模型是物理地址=段地址*16+偏移地址
x86保护模式
这是另外一种分段的内存模型.由于实模式下有20根地址线,在x86-32架构下有32位地址线,那么如何去使用和管理这4g的内存?并且现在机器都是多任务的,需要任务之间隔离内存访问。于是,x86-32的保护模式,采用了表格登记分配的方式。段先在全局的一张表格中登记.表格实际上是一个数组,每个元素8字节,里面保存的段的基地址和段的界限,基地址+界限就可以确定一个段
然后在访问内存时,段寄存器不再表示基地址,而表示在表格中的序号,通过序号查找到在内存中的区块.这样表示有很多好处,可以对段加权限标记,x86-32是有2位来表示段权限,总共有4个权限.cpu在访问时,**用sp的权限(当前代码段的权限)**表示当前cpu的权限,如果比要访问的段权限高,就可以访问,否则拒绝访问;也可以对16位程序保持兼容;也可以对任务实现内存隔离
一般把这个表格叫做GDT,cpu会有一个寄存器记录GDT的首地址
x64长模式
有2种子模式,纯的64位模式和兼容模式(kernel工作在64位,在返回应用时工作在32位)