1.ReentrantLock 源码解析 | 京东云技术团队
2.linux内核源码:网络通信简介——网络拥塞控制之BBR算法
3.微信预约挂号系统源码 医院公众号1分钟搞定网上“挂缴查”攻略!线排下载
ReentrantLock 源码解析 | 京东云技术团队
并发指同一时间内进行了多个线程。队源并发问题是码线多个线程对同一资源进行操作时产生的问题。通过加锁可以解决并发问题,排队ReentrantLock 是源码锁的一种。
1 ReentrantLock
1.1 定义
ReentrantLock 是线排下载埋伏指标源码 Lock 接口的实现类,可以手动的队源对某一段进行加锁。ReentrantLock 可重入锁,码线具有可重入性,排队并且支持可中断锁。源码其内部对锁的线排下载控制有两种实现,一种为公平锁,队源另一种为非公平锁.
1.2 实现原理
ReentrantLock 的码线实现原理为 volatile+CAS。想要说明 volatile 和 CAS 首先要说明 JMM。排队
1.2.1 JMM
JMM (java 内存模型 Java Memory Model 简称 JMM) 本身是源码一个抽象的概念,并不在内存中真实存在的,它描述的是一组规范或者规则,通过这组规范定义了程序中各个变量的访问方式.
由于 JMM 运行的程序的实体是线程。而每个线程创建时 JMM 都会为其创建一个自己的挂机监控php源码工作内存 (栈空间), 工作内存是每个线程的私有数据区域。而 java 内存模型中规定所有的变量都存储在主内存中,主内存是共享内存区域,所有线程都可以访问,但线程的变量的操作 (读取赋值等) 必须在自己的工作内存中去进行,首先要将变量从主存拷贝到自己的工作内存中,然后对变量进行操作,操作完成后再将变量操作完后的新值写回主内存,不能直接操作主内存的变量,各个线程的工作内存中存储着主内存的变量拷贝的副本,因不同的线程间无法访问对方的工作内存,线程间的通信必须在主内存来完成。
如图所示:线程 A 对变量 A 的操作,只能是从主内存中拷贝到线程中,再写回到主内存中。
1.2.2 volatile
volatile 是 JAVA 的关键字用于修饰变量,是 java 虚拟机的轻量同步机制,volatile 不能保证原子性。 作用:
作用:CAS 会使用现代处理器上提供的仿凡客源码高效机器级别原子指令,这些原子指令以原子方式对内存执行读 - 改 - 写操作。
1.2.4 AQSAQS 的全称是 AbstractQueuedSynchronizer(抽象的队列式的同步器),AQS 定义了一套多线程访问共享资源的同步器框架。
AQS 主要包含两部分内容:共享资源和等待队列。AQS 底层已经对这两部分内容提供了很多方法。
2 源码解析
ReentrantLock 在包 java.util.concurrent.locks 下,实现 Lock 接口。
2.1 lock 方法
lock 分为公平锁和非公平锁。
公平锁:
非公平锁:上来先尝试将 state 从 0 修改为 1,如果成功,代表获取锁资源。如果没有成功,调用 acquire。state 是 AQS 中的一个由 volatile 修饰的 int 类型变量,多个线程会通过 CAS 的方式修改 state,在并发情况下,只会有一个线程成功的修改 state。
2.2 acquire 方法
acquire 是wpf 文件上传源码一个业务方法,里面并没有实际的业务处理,都是在调用其他方法。
2.3 tryAcquire 方法
tryAcquire 分为公平和非公平两种。
公平:
非公平:
2.4 addWaiter 方法
在获取锁资源失败后,需要将当前线程封装为 Node 对象,并且插入到 AQS 队列的末尾。
2.5 acquireQueued 方法
2.6 unlock 方法
释放锁资源,将 state 减 1, 如果 state 减为 0 了,唤醒在队列中排队的 Node。
3 使用实例
3.1 公平锁
1. 代码:
2. 执行结果:
3. 小结:
公平锁可以保证每个线程获取锁的机会是相等的。
3.2 非公平锁
1. 代码:
2. 执行结果:
3. 小结:
非公平锁每个线程获取锁的机会是随机的。
3.3 忽略重复操作
1. 代码:
2. 执行结果:
3. 小结:
当线程持有锁时,不会重复执行,可以用来防止定时任务重复执行或者页面事件多次触发时不会重复触发。
3.4 超时不执行
1. 代码:
2. 执行结果:
3. 小结:
超时不执行可以防止由于资源处理不当长时间占用资源产生的死锁问题。
4 总结
并发是现在软件系统不可避免的问题,ReentrantLock 是可重入的独占锁,比起 synchronized 功能更加丰富,linux 0.01内核源码支持公平锁实现,支持中断响应以及限时等待等,是处理并发问题很好的解决方案。
linux内核源码:网络通信简介——网络拥塞控制之BBR算法
从网络诞生至十年前,TCP拥塞控制采用的经典算法如reno、new-reno、bic、cubic等,在低带宽有线网络中运行了几十年。然而,随着网络带宽的增加以及无线网络通信的普及,这些传统算法开始难以适应新的环境。
根本原因是,传统拥塞控制算法将丢包/错包等同于网络拥塞。这一认知上的缺陷导致了算法在面对新环境时的不适应性。BBR算法的出现,旨在解决这一问题。BBR通过以下方式控制拥塞:
1. 确保源端发送数据的速率不超过瓶颈链路的带宽,避免长时间排队造成拥塞。
2. 设定BDP(往返延迟带宽积)的上限,即源端发送的待确认在途数据包(inflight)不超过BDP,换句话说,双向链路中数据包总和不超过RTT(往返延迟)与BtlBW(瓶颈带宽)的乘积。
BBR算法需要两个关键变量:RTT(RTprop:往返传播延迟时间)和BtlBW(瓶颈带宽),并需要精确测量这两个变量的值。
1. RTT的定义为源端从发送数据到收到ACK的耗时,即数据包一来一回的时间总和。在应用受限阶段测量是最合适的。
2. BtlBW的测量则在带宽受限阶段进行,通过多次测量交付速率,将近期的最大交付速率作为BtlBW。测量的时间窗口通常在6-个RTT之间,确保测量结果的准确性。
在上述概念基础上,BBR算法实现了从初始启动、排水、探测带宽到探测RTT的四个阶段,以实现更高效、更稳定的网络通信。
通信双方在节点中,通过发送和接收数据进行交互。BBR算法通过接收ACK包时更新RTT、部分包更新BtlBW,以及发送数据包时判断inflight数据量是否超过BDP,通过一系列动作实现数据的有效传输。
在具体的实现上,BBR算法的源码位于net\ipv4\tcp_bbr.c文件中(以Linux 4.9源码为例)。关键函数包括估算带宽的bbr_update_bw、设置pacing_rate来控制发送速度的bbr_set_pacing_rate以及更新最小的RTT的bbr_update_min_rtt等。
总的来说,BBR算法不再依赖丢包判断,也不采用传统的AIMD线性增乘性减策略维护拥塞窗口。而是通过采样估计网络链路拓扑情况,极大带宽和极小延时,以及使用发送窗口来优化数据传输效率。同时,引入Pacing Rate限制数据发送速率,与cwnd配合使用,有效降低数据冲击。
微信预约挂号系统源码 医院公众号1分钟搞定网上“挂缴查”攻略!
微信预约挂号系统源码详解,医院公众号轻松实现线上“挂缴查”!
随着医院就诊人数的增长,微信公众号作为医疗服务的重要渠道,推出了包括“预约挂号”、“门诊缴费”、“候诊信息”、“报告查询”和“发票下载”在内的多项便捷功能。患者只需关注公众号,使用C#和uni-app技术开发的系统,1分钟内即可注册并开始一站式在线操作,显著提升了就医效率和体验。
这套系统的开发环境包括.net技术架构,使用C#语言和VS开发工具,前端框架采用uni-app,后端同样基于.net,数据库则选用Sqlserver 。同时,它支持微信公众号和支付宝小程序,覆盖了移动端的广泛需求。
在使用规则上,有特定要求,如若出现发热等症状或接触过高风险地区,建议先到发热门诊就诊。预约挂号后,请按预约时间提前分钟到达,过号需重新排队,如无法按时请提前3小时取消,过时未取消的预约需到医院退费。口腔科就诊者需提供小时内核酸阴性结果,并提前预约。
微信预约挂号系统对各类人群具有广泛的应用。上班族能借此避免因工作忙碌而错过就诊,老年人也能因其操作简便而便捷挂号。对于异地就医者,它提供了一站式的解决方案,省去对当地医院的不熟悉带来的困扰。
总的来说,微信预约挂号系统不仅为患者带来了高效便捷的就医体验,同时也因其多功能性和适用性,成为现代医院管理和服务的重要工具。