Lock接口(锁的实现)

来源:互联网 发布:彩虹无人机 知乎 编辑:程序博客网 时间:2024/06/05 16:19

之前都是使用Synchronized来实现锁功能,java 1.5之后增加了lock接口来增强锁的功能;lock提供的新功能有尝试非阻塞式获取锁、能被中断获取锁、超时获取锁。方法有:1lock()  2lockInterruptibly()  3tryLock()   4unlock()   5newCondition()等方法;

锁的功能实现基于队列同步器AQS,通过内置的FIFO队列来完成资源获取线程的排队工作;同步器的三个基本方法getState()setState(int newstate)compareAndSetState(int expect,int update)(通过CAS设置当前状态,保证原子性);同步器在获取锁时提供了一些模板方法去获取和释放锁或者查询线程状态acquire()acquireShared()release()等。AQS内置的FIFO队列是一个双向队列,其队列的每一个节点都是一个线程节点的封装,包含线程状态、前节点、后继节点等信息,同步器中也有headtail的成员变量。所以一个锁的具体实现本质就是在不断的进行队列的出队和入队操作,没有获得锁便把这个节点设置为同步队列的尾节点,这个入队需要CAS设置,因为有线程安全的问题。首节点是获得锁的节点,它在释放锁的同时会唤醒后继节点。同步队列中的所有线程节点其实都处于不断的自旋过程(是否能够CAS设置成功)(这里有个公平锁与非公平锁的区别,公平锁在获取锁之前还有检查它的前继节点是否为首节点)。同时锁的实现也分独占锁和共享锁,下面以可重入锁和读写锁的实现为例。可重入锁保证同一个线程可以多次持有某个锁,不会发生让自己阻塞自己的情况,互斥锁Mutex不可重入;典型应用是一个带同步的递归函数。

可重入锁又分为公平锁和不公平锁,公平锁会减少饥饿现象,但是比不公平锁都产生大量的线程切换,效率较低。可重入锁和读写锁维护的线程状态将是一个大于等于0的整型,代表持有锁的个数,只有变为0,才表示完全释放锁。读写锁维护一个32bit的二进制,高16位表示读状态,低16位表示写状态。

LockSupport工具,可以对线程实现管理,park()unpark(),等静态方法。

任何Object的锁对象都有一组监视器方法用于通信,但是对于lock来实现的同步,并非以资源对象为监视器的,而是自定义的重入锁或者读写锁等实现类,这会不具备通信的方法。所以java提供了Condition接口,用于实现通知/等待功能,signal()await()等方法,Condition的具体实例可以直接由Lock实例的newCondition()获取,其构造是在锁的实现上改进,一个condition代表一个等待队列,await()表示加入该Condition的等待队列,signal()表示从等待队列中移动到同步队列,从而退出await()的循环函数。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 喷砂机油水分离泵有油怎么办 水太烫玻璃瓶盖打不开怎么办 玻璃罐的玻璃盖打不开怎么办? 开红酒没有开瓶器怎么办 手机卡突然坏了怎么办 滚筒洗衣机打不开门怎么办 全自动洗衣机门开不开怎么办 好期待评分不足怎么办 单片机数码管亮度低怎么办 猫的同轴灯不亮怎么办 楼下邻居太吵怎么办 冰箱冷却液内露怎么办 冷却水没有了会怎么办 金立m7信号不好怎么办 csgo凉了饰品怎么办 模型拟合度低怎么办 石膏线用发泡胶怎么办 电表上显示err10怎么办 电表显示欠压怎么办 tcl电视遥控器失灵怎么办 玩具汽车遥控器失灵怎么办 玩具车遥控丢了怎么办 按压扣坏了怎么办 电脑用不了鼠标怎么办 多肉上的肉虫子怎么办 警察被取消警衔怎么办 隐形眼镜带歪了怎么办 gta5正在加载慢怎么办 gta5线上卡住了怎么办 皮子掉的颜色怎么办 gta5死了之后车怎么办 潜水口里有水怎么办 800度近视潜水怎么办 不会游泳深潜怎么办 高度近视浮潜怎么办 电脑玩gta4卡怎么办 人体身上有螨虫怎么办 作训裤裤脚太肥怎么办 整天提心吊胆的工作怎么办 腹直肌分离三指怎么办 健身手臂变粗怎么办