import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.AbstractQueuedSynchronizer; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; public class MySimpleReadWriteLock { private Syn syn = new Syn(); private Lock readLock = new ReadLock(syn); private Lock writeLock = new WriteLock(syn); public MySimpleReadWriteLock() { } private static class ReadLock implements Lock { final private Syn syn; public ReadLock(Syn syn) { this.syn = syn; } @Override public void lock() { syn.acquireShared(1); } @Override public void lockInterruptibly() throws InterruptedException { syn.acquireInterruptibly(1); } @Override public boolean tryLock() { return syn.justTryAcquire(1); } @Override public boolean tryLock(long time, TimeUnit unit) throws InterruptedException { return syn.tryAcquireNanos(1, unit.toNanos(time)); } @Override public void unlock() { syn.release(1); } @Override public Condition newCondition() { return syn.newCondition(); } } private static class WriteLock implements Lock{ private final Syn syn; public WriteLock(Syn syn) { this.syn = syn; } @Override public void lock() { syn.acquire(1); } @Override public void lockInterruptibly() throws InterruptedException { syn.acquireInterruptibly(1); } @Override public boolean tryLock() { return syn.justTryAcquire(1); } @Override public boolean tryLock(long time, TimeUnit unit) throws InterruptedException { return syn.tryAcquireNanos(1, unit.toNanos(time)); } @Override public void unlock() { syn.release(1); } @Override public Condition newCondition() { return syn.newCondition(); } } private static class Syn extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 1L; private static final int SHARED_SHIFT = 16; private static final int SHARED_UNIT = 1 << SHARED_SHIFT; private static final int EXCLUSIVE_MASK = (1 << SHARED_SHIFT) - 1; private static final HoldCounterThreadLocal LOCAL = new HoldCounterThreadLocal(); private HoldCounter holdCounter = null; private static class HoldCounterThreadLocal extends ThreadLocal<HoldCounter>{ @Override protected MySimpleReadWriteLock.Syn.HoldCounter initialValue() { return new HoldCounter(); } } private static class HoldCounter { int i = 0; long tid = Thread.currentThread().getId(); public int decrement(int arg) { return i-=arg; } public int increment(int acquires) { return i+=acquires; } } @Override protected int tryAcquireShared(int acquires) { int state = super.getState(); Thread current = Thread.currentThread(); int exclusiveCount = exclusiveCount(state); if(exclusiveCount != 0 && current != getExclusiveOwnerThread()) {//current != getExclusiveOwnerThread() 保证写锁可以让读锁进 return -1; } int c = state + (acquires<<SHARED_SHIFT); if(compareAndSetState(state, c)) { HoldCounter hc = holdCounter; if(hc == null || hc.tid != current.getId() ) {//holdCounter.tid != current.getId() 利用的底层的缓存,导致每个线程可能看到的holdCounter是不一样的,很有可能是自己的,也有可能是其他线程的 holdCounter = hc = LOCAL.get(); } hc.increment(acquires); return 1; } return -1; } private int exclusiveCount(int state) { return EXCLUSIVE_MASK & state; } @Override protected boolean tryReleaseShared(int arg) { Thread current = Thread.currentThread(); HoldCounter hc = holdCounter; if(hc == null || hc.tid != current.getId()) { holdCounter = hc = LOCAL.get(); } if(hc.i-arg < 0) throw new IllegalMonitorStateException("release arg is illegal"); else hc.decrement(arg); for(;;) { //独占模式下的release不用for(;;) 因为只要判断了current和exclusiveOwnerThead就可以 但是共享模式下的,由于release可能会并发执行,需要保证原子操作,就for和cas int state = getState(); int nextc = state - (arg<<SHARED_SHIFT); if(compareAndSetState(state, nextc)) { return nextc == 0; } } } @Override protected boolean tryAcquire(int acquires) { return justTryAcquire(acquires); } private boolean justTryAcquire(int acquires) { int state = super.getState(); int w = exclusiveCount(state); Thread current = Thread.currentThread(); if(state==0) { if(super.compareAndSetState(state, state+acquires)) { setExclusiveOwnerThread(current); return true; } } else if(w==0 || current!=getExclusiveOwnerThread()) { return false; } else { if(compareAndSetState(state, state+acquires)) { return true; } } return false; } @Override protected boolean tryRelease(int arg) { Thread current = Thread.currentThread(); if(current!=getExclusiveOwnerThread()) { throw new IllegalMonitorStateException("release error"); } int p = super.getState(); int c = p-arg; if(c==0) { setState(c); setExclusiveOwnerThread(null); return true; } else { setState(c); return false; } } public Condition newCondition() { return new ConditionObject(); } @Override protected boolean isHeldExclusively() { return getExclusiveOwnerThread() == Thread.currentThread(); } } public Lock readLock() { return readLock; } public Lock writeLock() { return writeLock; } public boolean tryLock() { return syn.justTryAcquire(1); } public void lock() { syn.acquire(1); } public void unlock() { syn.release(1); } }
import java.util.concurrent.locks.Lock; public class MySimpleRWLockTest { static Lock readLock = null; static Lock writeLock = null; static { MySimpleReadWriteLock lock = new MySimpleReadWriteLock(); readLock = lock.readLock(); writeLock = lock.writeLock(); } public static void main(String[] args) { writeLockTest(); readLockTest(); } private static void writeLockTest() { TestWorker worker = new TestWorker() { @Override public void exe() { System.out.println("..........start write ...."); writeLock.lock(); try { System.out.println("enter write ...."); Thread.sleep(2000); System.out.println("exit write ...."); } catch (Exception e) { } finally { writeLock.unlock(); } } }; worker.printTakeTimeMutil(2); } private static void readLockTest() { TestWorker worker = new TestWorker() { @Override public void exe() { System.out.println("..........start read ...."); readLock.lock(); try { System.out.println("enter read ...."); Thread.sleep(1000); System.out.println("exit read ...."); } catch (Exception e) { } finally { readLock.unlock(); } } }; worker.printTakeTimeMutil(5); } }
..........start write ....
..........start read ....
enter write ....
..........start read ....
..........start write ....
..........start read ....
..........start read ....
..........start read ....
exit write ....
enter read ....
enter read ....
exit read ....
exit read ....
enter write ....
exit write ....
enter read ....
enter read ....
enter read ....
exit read ....
exit read ....
exit read ....
相关推荐
基于MATLAB车牌识别系统【带界面GUI】.zip。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
DG储能选址定容模型matlab 程序采用改进粒子群算法,考虑时序性得到分布式和储能的选址定容模型,程序运行可靠 这段程序是一个改进的粒子群算法,主要用于解决电力系统中的优化问题。下面我将对程序进行详细分析。 首先,程序开始时加载了一些数据文件,包括gfjl、fljl、fhjl1、cjgs和fhbl。这些文件可能包含了电力系统的各种参数和数据。 接下来是一些参数的设置,包括三种蓄电池的参数矩阵、迭代次数、种群大小、速度更新参数、惯性权重、储能动作策略和限制条件等。 然后,程序进行了一些初始化操作,包括初始化种群、速度和适应度等。 接下来是主要的迭代过程。程序使用粒子群算法的思想,通过更新粒子的位置和速度来寻找最优解。在每次迭代中,程序计算了每个粒子的适应度,并更新个体最佳位置和全局最佳位置。 在每次迭代中,程序还进行了一些额外的计算,如潮流计算、储能约束等。这些计算可能涉及到电力系统的潮流计算、功率平衡等知识点。 最后,程序输出了一些结果,包括最佳位置和适应度等。同时,程序还绘制了一些图形,如电压和损耗的变化等。 综上所述,这段程序主要是一个改进的粒子群算法,用于解决电力
三保一评关系与区别分析
Day-05 Vue22222222222
多功能知识付费源码下载实现流量互导多渠道变现+搭建教程。资源变现类产品的许多优势,并剔除了那些无关紧要的元素,使得本产品在运营和变现能力 方面实现了质的飞跃。多领域素材资源知识变现营销裂变独立版本。 支持:视频、音频、图文、文档、会员、社群、用户发布、创作分成、任务裂变、流量主、在线下载等多种功能,更多功能 正在不断更新中... 支持流量主变现模式,付费下载付费古观看等变现模式。 实现流量互导,多渠道变现。可以独立部署,并绑定自有独立域名,没有域名限制。
住家保姆的工作职责、照顾老人住家保姆服务内容.docx
《高温中暑事件卫生》一级(红色),二级(橙色),三级(黄色),四级(蓝色).docx
职业中专技工学校专业评估表.docx
统计计算使用R一书的源代码Rcode.zip
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
社区居民诊疗健康功能描述 社区居民诊疗健康系统是一个为社区居民提供健康管理、疾病预防、诊疗服务和健康教育的综合平台。该平台致力于提升居民的健康水平,通过智能化、便捷化的服务为居民提供高效的健康保障。以下是该系统的主要功能描述: 1. 用户注册与登录 居民注册:居民可以通过身份证、手机号或社交媒体账号进行注册,填写个人基本信息(如姓名、性别、年龄、联系方式等)并创建账户。 健康档案管理:每个居民注册后,系统会自动生成个性化健康档案,记录个人的健康历史、疾病记录、体检报告等。 2. 健康档案与记录管理 个人健康档案:包括居民的基础健康信息、既往病史、用药记录、免疫接种记录、体检报告等。 诊疗记录管理:记录每次诊疗信息,如诊断、治疗方案、用药情况及随访记录。 健康指标监测:定期记录和更新如血压、血糖、体重、体脂等常见健康指标,便于长期追踪和分析。 3. 在线问诊与诊疗服务 在线咨询:居民可以通过平台预约或直接向社区医生发起在线问诊,获取健康咨询、疾病预防建议、用药指导等服务。 远程诊疗:提供视频问诊功能,方便居民与医生进行实时面对面的远程交流,获得更加详细的诊疗建议。 预约就诊:居民可以
面部、耳廓损伤损伤程度分级表.docx
项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7
功能完善的小说CMS系统项目全套技术资料.zip
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7
内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
hw06
这个项目是使用C++实现的即时通信系统,具有高性能、高并发的特点,项目包括客户端和服务器,实现了以下功能:注册、登录、点对点聊、群聊、上下线通知、用户在线信息、拉取好友信息、拉取好友分组信息、拉取群信息、拉取群成员信息;使用到的语言包括C++、Node.js;开源库:Boost C++ Libraries、Openssl、Protobuf、Hiredis、Socket.io;相关开发工具:Redis、Sqlite、Nginx、Microsoft Visual Studio、Visio;
医疗设备管理功能描述 医疗设备管理系统的主要目的是为医院和医疗机构提供高效的设备管理解决方案,确保医疗设备的安全、有效和高效使用。以下是该系统可能具备的功能描述: 1. 设备信息管理 设备登记:记录所有医疗设备的基本信息,包括设备名称、型号、序列号、生产厂家、购置日期等。 设备分类:将设备按类型(如影像设备、监护设备、实验室设备等)进行分类,方便查询和管理。 设备状态跟踪:实时更新设备的使用状态(如在用、维修中、闲置等),确保信息准确。 2. 设备维护管理 维护计划:制定设备的定期维护计划,设置维护周期和提醒通知。 维护记录:记录每次设备维护的详细信息,包括维护日期、维护内容、维护人员等。 故障报告:提供故障报告功能,用户可以快速记录设备故障并提交给维护人员。 3. 设备使用管理 使用申请:医务人员可以在线申请使用特定设备,系统自动记录申请信息。 使用记录:记录设备的使用情况,包括使用时间、使用人员、使用目的等,便于后续查询。 使用统计:生成设备使用统计报表,分析设备的使用频率和效率。 4. 库存管理 库存监控:实时监控医疗设备的库存情况,确保设备充足。 设备采购管理:记录设备采购