我们在计算机操作系统这门专业课上,学过死锁(Deadlock)的概念:两个或两个以上的进程(或线程)在执行过程中,由于竞争资源而造成的一种阻塞的现象,称为死锁。若无外力干预,这些处于死锁状态的进程将永远处于互相等待的阻塞状态中。
正好我儿子走到我电脑前看到文章标题,好奇地问我什么是死锁。我解释道,“假设你和白妹妹(他的玩伴)手上都有一张奥特曼白金卡,你特别想要白妹妹手上那张白金卡,白妹妹也特别想要你手上那张白金卡。你们都想让对方把他/她手上那张卡送给你们,但你们都舍不得把自己手上那张卡送出去。这就是死锁。”
儿子又问,那这种情况咋办。
我说,只有靠大人的介入。比如你老爸出马,把你们手中两张卡都没收了,等我玩够了再还给你们,这样你们就不会死锁了。
不过Jerry仔细端详了这些一零后们喜欢玩的奥特曼卡片,发现毫无吸引我之处。我还是更喜欢欣赏和收藏这些反映祖国传统文化的水浒传人物卡片。
言归正传,在使用ABAP答这道面试题之前,我们先看看如何用Java编写一个会出现死锁的程序。
不到40行代码就完成任务。为了便于ABAP从业人员理解,没有使用Java里的Lambda表达式,否则代码可以更短。
该程序逻辑如下:
线程1持有资源1,试图持有资源2; 线程2持有资源2,试图持有资源1; 死锁发生;
现在进入ABAP部分。
ABAP帮助文档提到,使用SELECT SINGLE FOR UPDATE读取单条记录时,会自动在数据库层面为该条记录设置一把锁(Exclusive lock,有的中文文档翻译成排他锁)。如果上锁操作会导致死锁发生,则会抛出异常。
于是我们首先创建一个ABAP数据库表,插入两条记录:
再开发两个ABAP程序ZLOCK1和ZLOCK2,分别按照Z01, Z02和Z02, Z01的顺序使用SELECT SINGLE FOR UPDATE向数据库发起读取请求。
开启两个SAPGUI窗口,按照下面的步骤执行这两个程序,即可产生死锁。
(1) 以调试模式单步执行程序ZLOCK1,成功执行完SELECT SINGLE FOR UPDATE .. WHERE object_id = 'Z01', 意味着此时程序ZLOCK1在数据库层面对Z01这条记录设置了一把锁。
(2) 切换到另一个SAPGUI窗口,执行程序ZLOCK2, 单步调试执行完语句SELECT SINGLE FOR UPDATE .. WHERE object_id = 'Z02',即此时程序ZLOCK2在数据库层面对Z02成功上锁。
(3) 再回到窗口1,继续调试程序ZLOCK1,此时调试器会阻塞,因为ZLOCK1试图对Z02上锁,而此时程序ZLOCK2持有记录Z02的锁。程序ZLOCK1处于阻塞状态,等待ZLOCK2释放对记录Z02设置的锁。
(3) 回到窗口2,继续在调试模式下执行ZLOCK2程序第12行语句。此时程序ZLOCK2试图对记录Z01上锁,但该记录已经被程序ZLOCK1锁住了,程序ZLOCK2只好等待程序ZLOCK1释放对记录Z01的锁;而程序ZLOCK1永远也不可能释放对记录Z01上的锁,因为此刻它已经处于阻塞状态了,在等待程序ZLOCK2释放对记录Z02的锁。
此时ABAP Kernel检测到程序ZLOCK2发生了死锁,抛出一个运行时异常,结束了ZLOCK2的执行。程序ZLOCK2持有对记录Z02的锁也自动释放了。最后的结果是,程序ZLOCK1成功地对记录Z02上了锁。
在事务码ST22里,我们能观察到这次死锁的详情。
ABAP Kernel这种检测到死锁发生后,立刻终止程序运行的方式,节省了应用开发人员通过阅读代码去分析死锁的时间。
回到Jerry之前的Java程序,运行之后两个线程陷入死锁,在控制台上没有打印任何可供排错的信息。然而JDK本身提供了方便的检查Java应用死锁状态的命令行工具:jstack.
命令行执行jstack,传入Java程序的进程id,如果该程序发生了死锁,该工具会打印出程序里具体是哪一行代码,在试图对何种资源进行上锁操作时出现的死锁,从而帮助开发人员迅速定位到逻辑上存在缺陷的代码位置。
希望本文这个小小的例子能帮助大家回忆起死锁这个基础知识点,感谢阅读。
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
相关推荐
ABAP面试题最全合集(含答案)
本文总结了ABAP经典面试题,涵盖了ABAP基础知识、数据对象、语句、报表程序设计等多方面的知识点。 1.ABAP基础知识 在ABAP中,数据类型可以分为基本数据类型、结构类型、内表类型等。基本数据类型包括字符、数字、...
### SAP ABAP 面试题解析 #### 一、锁对象与FM激活锁定对象 **锁对象(Lock Object)和FM(Function Module)** - **背景介绍:** 锁对象和FM是SAP ABAP中非常重要的概念,主要用于确保并发访问数据库时数据的...
本文总结了 ABAP 100 道面试题,涵盖了 ABAP 程序的结构、 Field Symbols 和 Field Groups、BDC 程序、Batch Input Session 等方面的知识点。 一、ABAP 程序的结构 ABAP 程序的典型结构包括 HEADER、BODY 和 ...
在 ABAP/4 中,TCODE SE80 是直接进入创建程序、函数组以及程序内部各种元素的入口。 二、数据对象 3. ABAP 试题 3:MANDT 字段的用处 MANDT 字段是 SAP 系统保留字段,用于区分表中的记录属于哪个客户端(client...
ABAP 面试题详解 ABAP 是 SAP 系统中的一个重要组件,作为一个专业的 IT 行业大师,我将对给定的文件信息进行详细的解释和分析,总结出相关的知识点。 1. 关于语句编译报错 在 ABAP 中,语句编译报错可能是由于...
下面是 ABAP 面试题汇总,涵盖了 ABAP 程序的结构、数据字典对象、批处理输入会话、批处理输入会话的替代方案、批处理输入会话的问题等方面。 ABAP 程序结构 ABAP 程序的典型结构包括 HEADER、BODY 和 FOOTER 三...
ABAP 面试题详解 ABAP 是一种高级编程语言,广泛应用于 SAP 系统开发中。以下是关于 ABAP 面试题的详细解释: 1. 下面的语句中,哪一个语句编译会报错? 正确答案:C)sflight-price = a+b。 原因是,在 ABAP 中...
ABAP 面试题知识点总结 ABAP 面试题中涉及到多个重要的知识点,本节给出详细的知识点总结。 一、锁对象(Lock Object)和 Function Module * 锁对象是用于锁管理的重要工具,创建锁对象时,系统会自动生成两个 ...
【ABAP面试题解析】 1. **锁对象与FM激活** 锁对象在ABAP中用于并发控制,确保数据的一致性。当在ABAP字典中创建一个锁对象时,系统会自动生成两个FM:`ENQUEUE_<锁对象名>`用于设置锁,`DEQUEUE_<锁对象名>`用于...
ABAP 面试问题及答案 ABAP 是一種高级编程语言,主要應用在 SAP 系统中。以下是 ABAP 面试问题及答案,涵盖了锁对象、Function Module、ABAP 内存、授权对象、修改、修改助手、功能模块出口、事务变式等知识点。 ...
SAP ABAP面试题目 在 SAP 系统中,锁对象(Lock Object)和 Function Module(FM)激活锁定对象时,产生的 FM 的名字是什么?答案是:ENQUEUE_<锁对象名> 用于设锁,DEQUEUE_<锁对象名> 用于释放锁。这些锁 FM 是在...
1. 在ABAP/4的开发工作中,哪一个TCODE是直接进入就可以创建程序、函数组以及程序内部各种元素的? 答案:A) SE80 知识点:SE80是ABAP Workbench的入口,用于创建、编辑和测试ABAP程序。 2. 下面的定义语句中,哪...
ABAP,全称Advanced Business Application Programming,是SAP公司的编程语言,用于开发在SAP系统上的应用程序。本考题集主要针对初学者,旨在帮助他们理解和掌握ABAP的基础知识。 1. ABAP Dictionary事务码:在SAP...
ABAP程序下载工具1.4.4是一款专为SAP系统设计的应用,它允许用户方便地批量下载ABAP源代码程序。在SAP系统中,ABAP(Advanced Business Application Programming)是主要的编程语言,用于开发和定制企业级业务应用...
abap面试题
ABAP程序相互调用是指在ABAP中,通过SUBMIT关键字实现程序之间的调用,这是一个非常有用的关键字。下面我们将详细介绍ABAP程序相互调用的方法和用法。 一、调用另一个程序 在ABAP中,我们可以使用SUBMIT关键字来...
1. **开发工具**: ABAP WorkBench包含一系列开发工具,如SE38(ABAP Editor)、SE80(Object Navigator)、SE24(Enhancement Builder)等,它们使得开发者能够编写、编辑、调试和管理ABAP代码。 2. **对象浏览器**...
ABAP(Advanced Business Application Programming)是一种高级商业应用程序编程语言,主要用于SAP R/3系统中。ABAP语言具有强大的编程能力、灵活的数据类型、丰富的内置函数和强大的错误处理机制等特点。ABAP程序是...