wap网站的未来郴州旅游

pingmian/2025/10/11 15:26:11/文章来源:
wap网站的未来,郴州旅游,网站效果检测,怎样在国外网站上做外贸广告文章目录一:AQS简介二:了解AQS 上锁和释放锁的原理1:前言2:上锁(非公平锁)(1):我们从main主函数中点进去(2):从lock进入(3):找到非公平锁中的lock(4):查看acquire()方法(5):查看tryAcquire(arg)方法a:前言介绍b:进入ReentrantLock类中的nonfairTryAcquire方法(6):addWaiter(Nod… 文章目录一:AQS简介二:了解AQS 上锁和释放锁的原理1:前言2:上锁(非公平锁)(1):我们从main主函数中点进去(2):从lock进入(3):找到非公平锁中的lock(4):查看acquire()方法(5):查看tryAcquire(arg)方法a:前言介绍b:进入ReentrantLock类中的nonfairTryAcquire方法(6):addWaiter(Node.EXCLUSIVE)a:前言b:源码走一波(7): acquireQueued(Node, int)a:acquireQueuedb: shouldParkAfterFailedAcquire(pred, Node)c:parkAndCheckInterrupt()d:小结 acquireQueued()总结下该函数的具体流程(8):总结3:公平锁4:释放锁(1):从main函数进入(2):在进入Release(ReentrantLock的类中)(3):进入AQS源码中(4): unparkSuccessor(h)a:源码解析b:为啥处于等待结点时候是逆序(5):小结一:AQS简介 AQS全称为AbstractQueuedSynchronizer它是一个一个抽象类在AQS中有几个属性和一个双向队列CLH队列 //头节点 private transient volatile Node head; //尾节点 private transient volatile Node tail; //状态值 private volatile int state;AQS是一个基类在JUC并发包下其实现类有ReentrantLock,CountDownLatch,…图示例 二:了解AQS 上锁和释放锁的原理 1:前言 我们是通过AQS的实现类ReentrantLock来进行解析其上锁 和 释放锁的原理但是ReetrantLock锁是有公平锁和非公平锁以及可重入锁的分类的 我们先看非公平锁 2:上锁(非公平锁) (1):我们从main主函数中点进去 public static void main(String[] args) {ReentrantLock lock new ReentrantLock();lock.lock();//点进去lock看源码}(2):从lock进入 public void lock() {sync.lock();}解释:我们这里从lock直接点进去看源码的话,其实是进了 sync的该sync类中是定义了lock这个方法的,并且syn 内部类是继承自AbstractQueuedSynchronizer类那我们的非公平锁类和公平锁类是继承自 sync 这个类的并且实现其lock方法 。 (3):找到非公平锁中的lock final void lock() {//以CAS的方式尝试将 state 状态从 0改为1,如果返回 true 则说明上锁成功否则该资源有线程占用修改失败if (compareAndSetState(0, 1))//证明当前线程拿到了锁资源setExclusiveOwnerThread(Thread.currentThread());elseacquire(1);}(4):查看acquire()方法 public final void acquire(int arg) {if (!tryAcquire(arg) acquireQueued(addWaiter(Node.EXCLUSIVE), arg))selfInterrupt();}tryAcquire()尝试直接去获取资源如果成功则直接返回这里体现了非公平锁每个线程获取锁时会尝试直接抢占加塞一次而CLH队列中可能还有别的线程在等待如果尝试获取资源失败的话 也就是 tryAcquire(arg) false 而 !tryAcquire(arg) true 那么接下来就将该线程封装成一个结点Node将其追加到AQS的队列后面中。 (5):查看tryAcquire(arg)方法 a:前言介绍 我们点击tryAcquire()的话,我们是直接进入到的是 AQS 基类的 tryAcquire(),这里并没有给出什么具体的实现;但是其实现类 ReentrantLock中 是有其实现的所以我们需要在ReentrantLock中寻找tryAcquire()的方法 b:进入ReentrantLock类中的nonfairTryAcquire方法 final boolean nonfairTryAcquire(int acquires) {//获取到当前的线程final Thread current Thread.currentThread();//获取到AQS的state值int c getState();//c 0 证明此时无锁,我们可以通过CAS对某个资源进行上锁if (c 0) {if (compareAndSetState(0, acquires)) {//证明当前线程拿到了资源setExclusiveOwnerThread(current);return true;}}//锁重入了, 就是我们同一个线程对一个资源上了多次锁else if (current getExclusiveOwnerThread()) {//将State 1int nextc c acquires;//当c是最大值的时候 再1的话,那么在二进制中 符号位就会从1到0,那么的话整个值就为负数if (nextc 0) // overflowthrow new Error(Maximum lock count exceeded);//重新对AQS中的state值进行赋值setState(nextc);return true;}return false;}(6):addWaiter(Node.EXCLUSIVE) a:前言 如果尝试获取资源失败的话,那么我们将该线程封装成Node结点,并将其放到AQS队列尾部 b:源码走一波 private Node addWaiter(Node mode) {//这里就是将当前线程封装成一个结点,mode有两种EXCLUSIVE独占和SHARED共享,在reentrantLock中,mode 是独占锁Node node new Node(Thread.currentThread(), mode);// Try the fast path of enq; backup to full enq on failure//获取到AQS队列的尾部结点Node pred tail;//如果队列不空的话if (pred ! null) {//让新的结点指向AQS尾部结点双向队列node.prev pred;//因为AQS队列中tail一直指向的是最后一个结点,所以我们通过CAS操作将 tail指向最后一个结点if (compareAndSetTail(pred, node)) {//让倒数第二个结点指向倒数第一个结点pred.next node;return node;}}//如果队列为空的话 或者是CAS操作失败的话,enq(node);return node;}如果队列为空的话 或者是CAS操作失败的话,则进入enq()函数; private Node enq(final Node node) {//死循环,CAS通过自旋的方式一定将结点成功的插入到队列尾部,for (;;) {//获取队列的尾部结点 Node t tail;if (t null) { // Must initialize 初始化完成后 tail和head都指向该node结点if (compareAndSetHead(new Node()))tail head;} else { //else 就是上个函数CAS操作失败了,或者是初始化的时候发生线程上下文切换,那么的话我们执行下列代码node.prev t;if (compareAndSetTail(t, node)) {t.next node;return t;}}}}(7): acquireQueued(Node, int) a:acquireQueued 通过tryAcquire()和addWaiter()该线程获取资源失败已经被放入等待队列尾部了,进入等待状态休息直到其他线程彻底释放资源后唤醒自己自己再拿到资源然后就可以去干自己想干的事了(跟医院排队拿号有点相似~~acquireQueued()就是干这件事在等待队列中排队拿号中间没其它事干可以休息直到拿到号后再返回) 1 final boolean acquireQueued(final Node node, int arg) {2 boolean failed true;//标记是否成功拿到资源3 try {4 boolean interrupted false;//标记等待过程中是否被中断过5 6 //又是一个“自旋”7 for (;;) {8 final Node p node.predecessor();//拿到前驱9 //如果前驱是head即该结点已成老二那么便有资格去尝试获取资源可能是老大释放完资源唤醒自己的当然也可能被interrupt了。 10 if (p head tryAcquire(arg)) { 11 setHead(node);//拿到资源后将head指向该结点。所以head所指的标杆结点就是当前获取到资源的那个结点或null。 12 p.next null; // setHead中node.prev已置为null此处再将head.next置为null就是为了方便GC回收以前的head结点。也就意味着之前拿完资源的结点出队了 13 failed false; // 成功获取资源 14 return interrupted;//返回等待过程中是否被中断过 15 } 16 17 //这里需要保证上一个结点是的-1 (SIGNAL -1 这个-1代表上一个锁是被唤醒的状态), 当是-1的时候返回true 18 if (shouldParkAfterFailedAcquire(p, node) 19 parkAndCheckInterrupt())//基于unsafe类的park()方法,阻塞线程直到被unpark()唤醒。 20 interrupted true;//如果等待过程中被中断过哪怕只有那么一次就将interrupted标记为true 21 } 22 } finally { 23 if (failed) // 如果等待过程中没有成功获取资源如timeout或者可中断的情况下被中断了那么取消结点在队列中的等待。 24 cancelAcquire(node); 25 } 26 }b: shouldParkAfterFailedAcquire(pred, Node) 此方法主要用于检查状态看看自己是否真的可以去休息了进入waiting状态万一队列前边的线程都放弃了只是瞎站着那也说不定对吧。(如果前驱节点pred的状态不是-1的话那么我们的Node就往前进寻找直到 找到一个前驱结点是-1的然后将Node放到其后面) 1 private static boolean shouldParkAfterFailedAcquire(Node pred, Node node) {2 int ws pred.waitStatus;//拿到前驱的状态3 if (ws Node.SIGNAL)//Node.SIGNAL -14 //如果已经告诉前驱拿完号后通知自己一下那就可以安心休息了5 return true;6 if (ws 0) {7 /*8 * 如果前驱放弃了那就一直往前找直到找到最近一个正常等待的状态并排在它的后边。9 * 注意那些放弃的结点由于被自己“加塞”到它们前边它们相当于形成一个无引用链稍后就会被保安大叔赶走了(GC回收) 10 */ 11 do { 12 node.prev pred pred.prev; 13 } while (pred.waitStatus 0); 14 pred.next node; 15 } else { 16 //如果前驱正常那就把前驱的状态设置成SIGNAL告诉它拿完号后通知自己一下。有可能失败人家说不定刚刚释放完呢 17 compareAndSetWaitStatus(pred, ws, Node.SIGNAL); 18 } 19 return false; 20 }整个流程中如果前驱结点的状态不是SIGNAL那么自己就不能安心去休息需要去找个安心的休息点同时可以再尝试下看有没有机会轮到自己拿号。 c:parkAndCheckInterrupt() 如果线程找好安全休息点后那就可以安心去休息了。此方法就是让线程去休息真正进入等待状态 private final boolean parkAndCheckInterrupt() {LockSupport.park(this);return Thread.interrupted();}park()会让当前线程进入waiting状态。在此状态下有两种途径可以唤醒该线程1被unpark()2被interrupt()。 d:小结 acquireQueued()总结下该函数的具体流程 结点进入队尾后检查状态找到安全休息点调用park()进入waiting状态等待unpark()或interrupt()唤醒自己被唤醒后看自己是不是有资格能拿到号。如果拿到head指向当前结点然后获取该锁资源如果没拿到继续流程1继续等待。 (8):总结 1 public final void acquire(int arg) { 2 if (!tryAcquire(arg) 3 acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) 4 selfInterrupt(); 5 }调用自定义同步器的tryAcquire()尝试直接去获取资源如果成功则直接返回没成功则addWaiter()将该线程加入等待队列的尾部并标记为独占模式acquireQueued()使线程在等待队列中休息有机会时轮到自己会被unpark()会去尝试获取资源。获取到资源后才返回。如果在整个等待过程中被中断过则返回true否则返回false。如果线程在等待过程中被中断过它是不响应的。只是获取资源后才再进行自我中断selfInterrupt()将中断补上。 3:公平锁 从源码中我们可以观察出,公平锁是在上锁的时候,并没有一上来就先去尝试获取资源,而是直接进入 acquire(1) static final class FairSync extends Sync {private static final long serialVersionUID -3000897897090466540L;final void lock() {acquire(1);}}4:释放锁 (1):从main函数进入 ReentrantLock lock new ReentrantLock();lock.lock();lock.unlock();//从这里进入(2):在进入Release(ReentrantLock的类中) public void unlock() {sync.release(1);}(3):进入AQS源码中 public final boolean release(int arg) {if (tryRelease(arg)) {Node h head;//找到头节点if (h ! null h.waitStatus ! 0)unparkSuccessor(h);//唤醒下一个线程 return true;}return false;}(4): unparkSuccessor(h) a:源码解析 private void unparkSuccessor(Node node) {int ws node.waitStatus;//获取到线程的状态, 小于0 说明数处于等待状态大于0说明说明该结点已经放弃等待if (ws 0)compareAndSetWaitStatus(node, ws, 0);//0状态就是已经完成的状态//得到头结点的后继结点head.nextNode s node.next;//如果这个后继结点为空或者状态⼤于0//通过前⾯的定义我们知道 ⼤于0只有⼀种可能 就是这个结点已被取消//那么我们就从重新再找个处于等待状态的结点去唤醒,我们找的顺序是从尾结点开始。if (s null || s.waitStatus 0) {s null;for (Node t tail; t ! null t ! node; t t.prev)if (t.waitStatus 0)s t;}if (s ! null)LockSupport.unpark(s.thread);}b:为啥处于等待结点时候是逆序 由于并发问题addWaiter()入队操作和cancelAcquire()取消排队操作都会造成next链的不一致而prev链是强一致的所以这时从后往前找是最安全的。 (5):小结 release()是独占模式下线程释放共享资源的顶层入口。它会释放指定量的资源如果彻底释放了即state0,它会唤醒等待队列里的其他线程来获取资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/88644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

建网站大公司搜索引擎优化的内容有哪些

后退N帧协议(GBN)一、后退N帧协议中的滑动窗口二、GBN发送方必须响应的三件事三、GBN接收方要做的事四、滑动窗口长度一、后退N帧协议中的滑动窗口 发送窗口:发送方维持一组连续的允许发送的帧的序号。 接收窗口:接收方维持一组连…

wnmp搭建后怎么做网站小程序游戏排名

文章目录 1. 介绍2. 使用2-1. 单击双击和长按2-2. 拖动和滑动2-3. 缩放 3. 注意点 1. 介绍 在 flutter 中,GestureDetector 是手势识别的组件,可以识别点击、双击、长按、拖动、缩放等手势事件,并且可以与子组件进行交互,构造函数…

设备建设网站永久免费网站建设系统

Vue 中简易封装网络请求(Axios),包含请求拦截器和响应拦截器 axios简介 Axios 是一个基于 promise 的网络请求库,可以用于浏览器和 node.js Axios官方中文文档 特性 从浏览器创建 XMLHttpRequests从 node.js 创建 http 请求支…

大型网站如何优化湖南省专业建设公司网站

FixedThreadPool 由Executors的newFixedThreadPool方法创建。它是一种线程数量固定的线程池,当线程处于空闲状态时,他们并不会被回收,除非线程池被关闭。当所有的线程都处于活动状态时,新的任务都会处于等待状态,直到有…

手机网站框架黄冈做网站的公司哪家好

今天主要学习了列表渲染和key的作用和原理,先来说说列表渲染,顾名思义想要渲染列表最快的方式就是使用for循环,我们要学习的就是Vue中对标签实现for循环的语法,它和我们传统的js语法有些不同,它是先要有Vue实例中data的…

视频网站大数据建设建设网站的基本知识

基于模拟退火算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于模拟退火算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于模拟退火优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…

东莞网站设计出名 乐云践新网站备案收费幕布

2019独角兽企业重金招聘Python工程师标准>>> 跟风学Docker之四:Docker网络解决方案 博客分类: docker 前言:前面的部分一直都是单机跑docker,但实际生产环境不可能只用一台来跑。肯定会用到多台,因为他们都…

网站建设设计图广告公司的经营范围有哪些

postman使用 开发中经常用postman来测试接口,一个简单的注册接口用postman测试: 接口正常工作只是最基本的要求,经常要评估接口性能,进行压力测试。 postman进行简单压力测试 下面是压测数据源,支持json和csv两个格…

贵州新站优化重庆制作网站开发app开发公司

站群服务器"通常指一组被单个实体或组织控制的网络站点,用于提高特定站点在搜索引擎中的排名。在讨论站群服务器与普通服务器的区别时,可能涉及到以下方面: 1. IP地址: 站群服务器: 站群服务器可能涉及多个站点&a…

深圳做手机网站设计推广公司业务话术

文章目录 前言技术资料 前言 随着物联网、大数据、智能制造技术的不断发展,越来越多的企业正在进行工厂的智能化转型升级。转型升级第一步往往是设备的智能化改造,助力设备数据快速上云,实现设备数据共享和场景互联。然而,在生产…

成都哪家网站建设做得好做国际网站怎么能快速打开

电脑 出入数据的地方是安全保障的最后一关 比如 网络 , usb 等等 控制联网流氓软件 1 在虚拟机里测试软件是否有恶意行为 恶意行为非常容易发现 比如 破坏文件 修改文件 系统不正常 像蓝屏 等等 2 网络防火墙 这是系统最关键的部分之一 像 windows 一定使用他…

做拆分盘网站亚马逊怎么做网站推广

今天又遇到了关于Android 动画方面的问题,免不了一番疯狂找资料,所幸解决了自己的问题,为了避免以后遇到同样的问题,再次到处找资料,于是决定写篇随笔记录下来,方便自己方便大家^_^;废话就不说了…

大凤号 网站建设关键词挖掘工具爱网

在很多场景中,我们可能需要单机上启动多个rabbitmq实例,启动多个实例其实就是启用不同的端口。rabbitmq的默认端口为5672,15672,25672,以下经过实际操作绝对原创,亲测有效,耗费了老半天时间,怎么没有白费啊…

开展农业信息网站建设工作深圳市新房备案价查询官网

进制 进制也就是进位制,是人们规定的一种进位方法对于任何一种进制—X进制,就表示某一位置上的数运算时是逢X进一位 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位…

零壹网站建设潍坊网站建设教程

介绍 Apache Superset 是一个现代的企业级商业智能 Web 应用程序。它快速、轻量、直观,并加载了各种选项,使所有技能的用户都可以轻松探索和可视化他们的数据,从简单的饼图到高度详细的 Deck.gl 地理空间图表。 安装 首先安装自制homebrew安…

有没有做请帖的网站提高工作效率8个方法

摘要: 2024-02-16 AIGC-数字人-硅基DUIX-记录 文档: https://duix.guiji.ai/duix-website/localHuman Digital Humans (guiji.ai) 文档中心 (guiji.ai) DUIX本地渲染SDK安卓集成文档_v1 | 文档中心 (guiji.ai) 本地化部署duix说明: 将DUIX离线部署到本地并在本地生成数字人需要…

网站开发工程师是干嘛的wordpress是什么需要

纠错码是个什么东西 引出 网络中的通信基于TCP和UDP两个通信协议, 这大家都知道的, 什么TCP的三次握手等等, 面试经常被问到. 三次握手是为了保证连接的正确建立. 但是, 在通信的时候, 你如何保证你的消息正确送达了呢? 有人说了, 有收到请求的响应包. 但我说的不是这个, 比…

做网站的底图尺寸多大沃尔玛跨境电商平台

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid2570 题目的意思:给你n个体积相同浓度不同的解药,让你配置出浓度不大于w的最大体积的解药: 解题过程:就是一个简单的排序加判断。弄了很久还是没有弄好,后来才发现…

重庆市网站建设网店美工考试题目

pdf文本分为两种,一种是标准的pdf格式的文本,这种无需利用ocr识别,另外一种就是图片文本,这种需要进行ocr的识别。 OCR 识别文本和文本区域 ppstructure是paddleocr里面的一个子库,可以识别文档的页眉页脚、正文、标…

北京网站建设排行榜服务号网站建设

在图像悬停时,我想放大图像并显示带有透明背景的div.这是我的代码.在下面的示例中,当我将鼠标悬停在.Image类中的图像上时,我想要缩放它,并希望在div的中心显示类.mylink的链接.我能够放大悬停但是当我为.text添加样式时,它不再放大图像.HTML:linkCSS:#B…