我们在计算机操作系统这门专业课上,学过死锁(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面试题系列:写一组会出现死锁(Deadlock)的ABAP程序相关推荐

  1. python手写代码面试_常见Python面试题—手写代码系列

    原标题:常见Python面试题-手写代码系列 1.如何反向迭代一个序列 #如果是一个list,最快的方法使用reverse tempList = [1,2,3,4] tempList.reverse( ...

  2. python手写代码面试_常见Python面试题 — 手写代码系列

    原标题:常见Python面试题 - 手写代码系列 作者: Peace & Love 来自:https://blog.csdn.net/u013205877/article/details/77 ...

  3. java面试题系列10

    一. Java基础部分 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 2.Java有没有goto? 3.说说&和&&的区别 ...

  4. Java容器--2021面试题系列教程(附答案解析)--大白话解读--JavaPub版本

    Java容器–2021面试题系列教程(附答案解析)–大白话解读–JavaPub版本 前言 序言 再高大上的框架,也需要扎实的基础才能玩转,高频面试问题更是基础中的高频实战要点. 适合阅读人群 Java ...

  5. 「前端面试题系列7」Javascript 中的事件机制(从原生到框架)

    前言 这是前端面试题系列的第 7 篇,你可能错过了前面的篇章,可以在这里找到: 理解函数的柯里化 ES6 中箭头函数的用法 this 的原理以及用法 伪类与伪元素的区别及实战 如何实现一个圣杯布局? ...

  6. c# 两个list比较_C#刷遍Leetcode面试题系列连载(1) 入门与工具简介(VS Code amp; VS)...

    什么要刷LeetCode 大家都知道,很多对算法要求高一点的软件公司,比如美国的FLAGM (Facebook.LinkedIn.Amazon/Apple.Google.Microsoft),或国内大 ...

  7. Jerry带您了解Restful ABAP Programming模型系列之三:云端ABAP应用调试

    Jerry的Restful ABAP Programming模型介绍系列的前两篇文章: 30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用 Jerry带 ...

  8. 【我解C语言面试题系列】003 死循环格式问题小结?

    [我解C语言面试题系列]003 死循环格式问题小结? 死循环格式问题小结 下面是几个"著名"的死循环: (1)操作系统死循环: (2)WIN32程序死循环: (3)嵌入式系统软件死 ...

  9. C#刷遍Leetcode面试题系列连载(6):No.372 - 超级次方

    点击蓝字"dotNET匠人"关注我哟 加个"星标★",每日 7:15,好文必达! 前文传送门: C# 刷遍 Leetcode 面试题系列连载(1) - 入门与工 ...

最新文章

  1. [导入]ExtJs 2.0 弹窗事例
  2. RIPv2相对于RIPv1来说主要有3方面的改进。下面的选项中,RIPv2的特点不包括【两个题】
  3. C语言解决关于兔子的古典问题的代码
  4. win8: hello gril
  5. 利用PHP SOAP实现web service
  6. 火车在提速,生活在加速,快节奏的生活让人们逐渐失去了驻足思考的能力,人们好像已经习惯抱团去做某一件事情,完全不顾这件事情到底适合不适合自己,我在想他们总...
  7. securecrt遇到一个致命的错误且必须关闭_淄博plc维修西门子plcs7-200致命错误7强制数据永久存储区错误...
  8. 2013华为校园招聘机试题9月10日题(杭州)
  9. Bone Collector(hdoj--2602--01背包)
  10. 客气话要靠谱。比如公司业务一直没开展,却说学到了太多东西,那学的难道是怎样把公司搞死?
  11. python数据结构基础的重点内容_Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】...
  12. 分享一个热血合击脚本辅助工具(以及随机数生成器源码)
  13. Properties 类的详细使用(十三)
  14. python文本自动伪原创_手把手教你使用python制作伪原创工具
  15. 解决ROS中运行launch文件报错ERROR: cannot launch node of type[xxx/xxx]:xxx的问题
  16. [论文写作笔记] C2论文写作结构与思路 C6 让研究方法称为加分项
  17. pbkdf2sha256加密验证算法 | 密码加密
  18. IOS成长之路-使用系统默认声音、震动
  19. linux12k8s --> 03二进制安装
  20. PAT甲级Invert a Binary Tree 柳神层序遍历的思路值得借鉴

热门文章

  1. 消除软硬件鸿沟,芯客网完美支持智能硬件在移动互联时代的爆发
  2. Objc基础学习记录5
  3. CentOS6.2下使用Nokia E72i成功发送短信
  4. Ubuntu 安装 Qt 开发环境(转)
  5. SSM中 出现错误 Could not open ServletContext resource [/WEB-INF/dispatcherServlet-servlet.xml]
  6. Eclipse vs IDEA快捷键对比大全
  7. 过滤html文本中的多余属性
  8. MYSQL 从头开始-1
  9. [转自 Flyingis]Geometry 对象浅析
  10. 使用spring @Scheduled注解执行定时任务