JS->Applet->JS导致死锁问题解决过程

一个JavaScriptCore框架中对象与Timer引发的死锁问题内幕 背景介绍 在奥运项目中,快手主站的首页入口挂件、金牌时刻弹窗需要进行动态布局和渲染,因对性能要求较高,我们采用了 JavaScriptCore 与 Native 交互的技术方案。在上线灰度放量的过程中,我们发现一个长卡顿问题占比明显上升,于是我们开始排查。其最后的调用栈信息如下: 经过分析排查,我们发现此问题具有以下特点: 1.Native 执行 JS 的方法时,问题发生概率较大。 2.从系统分布来看,问题只会在 iOS 13 系统出现。 3.从堆栈信息来看,无法判定问题发生的业务代码位置,只 阅读详情
 最近两天被一个非常棘手的问题缠住了,大致是这样的。为了和别的应用系统集成,我把WebGIS的客户端拆分了一下,Toolbar和Toc(图层树)分离出来用html实现,地图显示部分还是用Applet,用JavaScript来实现他们之间的交互。为了使html的Toc和Applet内部图层状态保持一致,我用回调机制来同步。也就是因为回调导致该页面如果放在一个ModalDialog中就会导致死锁,IE没有响应。而在普通的窗口中一切正常。
        Applet运行在IE中不好直接调试,也许我没有找到调试的办法。一旦死锁,Java Console也不再刷新,看不到任何东西,通常使用的写日志的方法不再起作用。怎么办呢,一开始我真的没把握能解决这个问题,但是没办法赶鸭子上架也得上。
        首先我观察死锁出现的规律,同事和我说不让它自动定位就不会死,但是我发现去掉自动定位手动定位也一样死。我所知道的Modal于Modaless的区别是不允许激活别的窗口,不能弹出非模态窗口。我一直想办法验证是否因为非模态窗口的原因,因为Toc在div元素中,div元素比较特别,会不会是独立窗口,因为只要操作一下Toc就会死。
         写到这里我想起了一句话“大胆假设,小心求证”。于是我逐一验证我的一系列假设,div上放一个按钮,Applet的一个回调方法去操作该按钮,没有问题。与div一点关系都没有,此外toc可以直接放在一个td元素中,还是照死不误。经过大量的猜测--验证,我终于找出了规律。纯粹的JS->Applet(Toolbar上的按钮)或者Applet->JS都可以,但是如果是JS->Applet->JS就会导致死锁。问题原因找出来,解决这个问题远非易事。
         Modal Dialog只允许一个线程执行,Applet很明显在另外的线程中执行,在JVM中运行,JS调用Applet的方法必须等Applet方法返回来才能执行新的函数或语句,模态对话框中不允许中途被打断去执行别的函数。但是回调不能不用,否则没法实现状态同步。
        粗略想了想,为了让Applet方法尽快返回,一个办法是创建另一个线程来执行回调。说干就干,真的不会死了,但是状态没有同步,看Java Console中消息Applet调用JS的方法被阻塞了,一直到窗口关闭的时候才返回。不能用另外的线程来执行回调,真是变态。这样的话只能用运行Applet的线程来执行,但是该线程会堵塞,几乎走入绝境了。
       我想到了定时器,而且是javax.swing.Timer。JS调用的Applet方法只是把定时器启动起来,把调用方法和参数放到List中就返回了。延迟一段时间后Applet再调用JS,此时JS对Applet的调用已经结束。效果不错!正要给同事演示,临时把延迟改为50ms,它又让我难堪了,还是死锁。后来把时间延长至1s,比较稳定了,但是必须保证在1s之内JS对Applet的调用必须结束,否则还是会出现死锁。还有所有的回调均延迟没有必要,反应很迟钝,从Applet到JS的调用根本没必要延迟的。进一步改进,设置状态变量,如果JS调用延迟,Applet发起的调用不延迟,这样JS脚本不需要作任何修改,只要更新Applet就可以解决问题,而对Applet的是自动下载的。
        这样结果还是比较令人满意的,做开发和搞科研很多地方是相似的,比如说大胆假设,小心求证。另外一个人的经验体现在根据问题症状作出的假设,对这方面的问题越了解,假设越接近事实,很快找到解决办法,反之折腾了半天不知道从何下手。用最简单最快的手段验证你的假设,根据新的观察修改你的模型。
死锁检测源代码 立即下载

相关推荐

Shopee App加密算法逆向实战:从抓包到libshpssdk.so的深度解析

本文详细解析了Shopee App加密算法的逆向过程,从网络抓包发现加密参数入手,通过Frida动态Hook定位到Java层关键方法,并深入追踪至Native层的libshpssdk.so核心函数。文章结合实战演示了如何利用Unidbg模拟执行环境进行算法分析与验证,并探讨了核心参数生成逻辑及风控规避要点,为移动安全与逆向工程研究提供了完整的技术路径。

weixin_28347369的博客 531

[js技巧]解决输入框焦点争夺

在表单验证时,输入框的验证经常会用到onblur事件,当验证不通过,有时会需要调用focus()把焦点移回输入框,就是不输对就不许其他操作那种,虽然应用场景不多,在实际使用时会产生一个焦点争夺的问题:   当两个输入框里都是验证不通过的值,焦点在a输入框,当用户点击b输入框时,a输入框的onblur验证方法调用focus()方法触发b输入框的onblur事件,又会要求把焦点设置到b上两个输入框...

kjah 395

CANOE仿真someip报文配置说明

利用canoe测试车辆控制器someip报文收发的步骤

AUTOSAR架构汽车软件开发 1万+

死锁的成因?怎么解决?

死锁是怎么造成的? 怎么解决死锁问题?

qq_53018217的博客 162

反激电源占空比为何必须小于0.5?次谐波振荡与斜坡补偿详解

在开关电源设计中,峰值电流模式控制因其优异的动态响应和逐周期限流保护而被广泛应用。其工作原理是通过采样电感电流的峰值,与误差电压比较来控制开关管的导通与关断。然而,这种控制方式在反激等隔离拓扑中,当占空比超过50%时,会面临一个固有的稳定性挑战——次谐波振荡。这是由于电流扰动会在相邻开关周期内被放大而非衰减,导致系统在开关频率一半处发生振荡,严重影响输出纹波和可靠性。为解决这一问题,工程上引入了斜坡补偿技术,通过向控制信号叠加一个固定斜率的斜坡,改变环路增益条件,从而在宽输入电压或高占空比需求下维持系统稳定

weixin_29631169的博客 630

MACS2软件进行Peak calling

MACS2可以检出ChIP-Seq,ATAC-seq 以及 MeRIP-seq (RNA甲基化测序) 等富集的序列。peaks calling 有不同的方法,MACS2是最常用的call peaks工具。 MACS全称Model-based Analysis of ChIP-Seq,最初的设计是用来鉴定转录因子的结合位点,但是它也可以用于其他类型的富集方式测序。usage: macs2 [-h] [--version] {callpeak,bdgpeakcall,bdgbroadca

qq_27390023的博客 3791

什么是死锁

转自:牛客网 死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力作用,他们都将无法推进下去,陷入死循环 例子:当线程1和2都已经成功获取到第一个锁时,死锁就发生了。     //线程1 Synchorized(objectA){     Synchorized(objectB){         //操作    

子衿_青青的博客 803

超分算法 SwinIR: Image Restoration Using Swin Transformer

这篇文章结构比较简单,如果看过Swin-Transformer的话就没什么难点了。作者引入Swin-T结构应用于低级视觉任务,包括图像超分辨率重建、图像去噪、图像压缩伪影去除。网络由一个浅层特征提取模块、深层特征提取模块、重建模块构成。重建模块对不同的任务使用不同的结构。浅层特征提取就是一个3×3的卷积层。深层特征提取是k个RSTB块和一个卷积层构成。RSTB(Res- SwinIR: Image Restoration Using Swin Transformer[ICCV 2021]Abstract1.

qq_45122568的博客 1万+

deadlocks(死锁)

所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等竺的进程称为死锁进程.由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。 一种情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每个线程都在等待被其他线程占用并堵塞了的资源。例如,如果线程A锁住了记录1并等待记录2,而线程B锁住了记录

js_xj的专栏 944

【GEE实战指南】Python本地API配置避坑与一站式环境搭建

本文详细介绍了Google Earth Engine(GEE)Python本地API的配置避坑指南与一站式环境搭建流程。通过conda创建隔离环境、账户认证关键步骤、初始化代码的正确写法以及实战测试案例,帮助开发者快速掌握GEE Python API的配置技巧,避免常见错误,提升地理空间数据分析效率。

weixin_42624889的博客 187

SCADA|RESTful学习,Apipost通过GET获取KingSCADA实时数据

本文介绍了如何使用RESTful实现SCADA与MES系统对接。主要包括:1)对比RESTful与其他协议的性能指标;2)KingSCADA作为Server/Client的三种应用场景;3)详细演示KingSCADA3.8作为Server端的配置过程,包括端口设置和API测试。通过Apipost工具测试获取变量值及数据回写接口,其中数据回写需使用MD5加密密码。文章最后指出回写测试失败的情况,但未分析具体原因。全文以实际工程应用为导向,提供了具体操作步骤和技术细节。

做有价值的事,积累有价值的笔记! 627

关于死锁的原因及解决方案

死锁的原因及解决详细讲解

qq_71360748的博客 622

Unity中语法糖带来的GC问题 ——那些看起来优雅、实际上在背后偷偷生垃圾的代码

*语法糖(Syntactic Sugar)**指的是编程语言中为了让代码更简洁、易读而提供的简便写法。比如C#中的foreachlambda表达式LINQ自动属性等。语法糖本身不是坏事,但在Unity等对GC敏感的环境下,要警惕语法糖带来的隐式内存分配。合理使用语法糖,关键场合用更“丑陋”但高效的写法,才能保证游戏流畅运行。下面我将更深入地分析Unity中语法糖导致GC的原理、具体场景、检测与优化技巧,并补充一些容易忽视的细节。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 520

JVM之jstack实战死锁问题

这个条件占用部分资源的线程进一步申请其他资源时,如果申请不到可以主动释放它占有的资源,这样不可抢占这个条件就破坏掉了。线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁。编写代码,启动2个线程,Thread1拿到了obj1锁,准备去拿obj2锁时,obj2已经被Thread2锁定,所以发送了死锁。,即存在一个等待队列:T1等待占有T2的资源,T2等待占有T3的资源,T3等待占有T1的资源。这样就形成了一个等待环路。,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。

write less , do more 1953

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

死锁的四个必要条件和解决办法

死锁概念及产生原理    概念:多个并发进程因争夺系统资源而产生相互等待的现象。    原理:当一组进程中的每个进程都在等待某个事件发生,而只有这组进程中的其他进程才能触发该事件,这就称这组进程发生了死锁。    本质原因:        1)、系统资源有限。        2)、进程推进顺序不合理。死锁产生的4个必要条件    1、互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程...

半暖的博客 18万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

js赋值如何模拟手动输入_谈谈你对锁的理解?如何手动模拟一个死锁?

在并发编程中有两个重要的概念:线程和锁,多线程是一把双刃剑,在提升性能的同时也带来了编码的复杂性,对开发者的要求也提升了一个档次。而锁的出现就是为了保障多线程同时操作一组资源时的数据一致性,当我们在给资源加上锁之后,只有拥有此锁的线程才能操作此资源,而其他线程只能排队等待使用此锁。如何手动模拟一个锁?谈谈你对锁的理解死锁指的是两个线程同时占有两个资源,同时又在等待对方释放锁资源。如图:死锁的代码演...

weixin_30639241的博客 228

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

jvm工具-jstack使用

一、介绍 jstack是java虚拟机自带的一种堆栈跟踪工具。jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项”-J-d64”,Windows的jstack使用方式只支持以下的这种方式: jstack [-l] pid   主要分为两个功能:  a.  针对活着的进程做本地的...

菜鸟腾飞 5024

死锁原因及解决、避免办法

死锁的条件     互斥条件(Mutual exclusion)     :资源不能被共享,只能由一个进程使用。     请求与保持条件(Hold and wait):进程已获得了一些资源,但因请求其它资源被阻塞时,对已获得的资源保持不放。     不可抢占条件(No pre-emption)    :有些系统资源是不可抢占的,当某个进程已获得这种资源后,系统不能强行收回,只能由进程使用完时自己释

liuqiang_mail的专栏 1295

死锁和阻塞的关系

在看并发编程的第一章的时候举出了一个死锁了的例子,感觉特别棒,于是就联想到了阻塞,我们知道在JAVA环境中,线程Thread有如下五个状态:(当然有人要说是七个状态,这个以后有机会再说) 1,新建状态 2,就绪状态 3,运行状态 4,阻塞状态 5,死亡状态 所以说在JAVA程序运行中阻塞是一种常见的运行状态,那么首先阻塞是什么? 在我理解,阻塞就是由于等待

liqinglin06的博客 7156

SQL Server死锁总结

SQL Server死锁总结 1. 死锁原理 根据操作系统中的定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。 死锁的四个必要条件:互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。请求与保持条件(Hold and wait):已经得到资源的进程...

weixin_30545285的博客 1028

产生死锁的原因和必要条件+解决死锁的基本方法

死锁:指多个进程因竞争共享资源而造成的一种僵局,若无外力作用,这些进程都将永远不能再 向前推进。 安全状态与不安全状态:安全状态指系统能按某种进程顺序来为每个进程分配其所需资源,直 至最大需求,使每个进程都可顺利完成。若系统不存在这样一个序列, 则称系统处于不安全状态。         产生死锁的原因:(1)竞争系统资源 (2)进程的推进顺序不当 产生死锁的必要条件: 互斥条件

Life Coding 5万+

js的工作原理

1、为什么js是单线程 这主要和js的用途有关,js是作为浏览器的脚本语言,主要是实现用户与浏览器的交互,以及操作dom;这决定了它只能是单线程,否则会带来很复杂的同步问题。 举个例子:如果js被设计了多线程,如果有一个线程要修改一个dom元素,另一个线程要删除这个dom元素,此时浏览器就会一脸茫然,不知所措。所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。 扩展: 什么是进程: 进程:是cpu分配资源的最小单位;(是能拥有资源和独立运行的最小

weixin_47450807的博客 2236

死锁实现和怎样分析死锁

分析死锁,我们需要用到"Java thread dump"应用,可以点击超链接查看。避免嵌套死锁:最是引起死锁最常见的原因,如果你已经有锁了避免锁住另一个资源。如果你只工作在一个对象上的锁,这是最不可能产生死锁的了。例如,这里有一个run方法的实现,在方法中,没有嵌套锁,程序会正常的运行而且不会产生死锁。只对需要的加锁: 你应该在为,在工作中的唯一资源(可能是一个局部,也可能是个对象,也可可能范围更广,但是那只是用到的资源;对于不需要的部分,不应该加锁)上的去获得锁,例如上面的程序,我只在完成的对象资源上加

arthur.dy.lee的专栏 3665

js模拟java同步锁

有这方面知识的朋友,看到题目会认为,你这样做没有意义的,因为script脚本永远不会产生并发。确实脚本执行是单线程的,即使有setTimeout、setInterval等方法,他也永远不会产生并发。所以这里只是模拟。     说明一下应用场景,在线考试系统有自动交卷和手工交卷,结构大致如下        function handInAuto(){     doHandIn();

ma345787383的博客 7489
上一篇: 希赛网软考学院将会使系分大大贬值
下一篇: 博闻视点翻译的书真的让人很失望!
complayer
博客等级 码龄25年 16粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值