Page 47 - 《软件学报》2021年第6期
P. 47

郝宗寅  等:Petri 网的反向展开及其在程序数据竞争检测的应用                                                1621


                 的 Petri 网模型如图 8(a)所示;
             (2)  锁的申请与释放:Java 中使用 synchronized 语句实现线程的互斥,包括同步方法和同步代码块,二者本
                 质上是相同的.当线程 t1 与线程 t2 同时访问同步代码块时,只有一个线程可获取访问权限.锁的申请
                 与释放对应的 Petri 网模型如图 8(b)所示;
             (3)  分支:Java 程序中的分支在逻辑上都等价于 if,if-else 型分支.对应的 Petri 网模型如图 8(c)所示;
             (4)  循环:Java 程序中的循环分为 for/while 型循环和 do-while 型循环,二者的结构相似,都由一个控制条件
                 和一个循环体构成.对应的 Petri 网模型如图 8(d)所示.


















                                 (a)  线程的启动与合并                (b)  锁的申请与释放



















                              (c)  程序中的分支                              (d)  程序中的循环

                                 Fig.8    Petri net models of Java concurrent programs
                                       图 8   Java 并发程序的 Petri 网模型
             图 9 给出了一个 Java 多线程程序的实例以及由上述规则构造所得的程序 Petri 网模型,其中,带星号的变迁
         对应程序语句,其余变迁仅用于表达程序结构.具体而言:
             (1)  程序语句方面,t1 代表创建线程 t1,t6 代表创建线程 t2,t14 代表将线程 t1 合并到主线程.t7,t8 代表申请
                 锁 lock,t15,t16 代表释放锁 lock.t9 对应语句 x=2,t10 对应语句 x=1,t11 对应语句 System.out.println(x);
             (2)  程序结构方面,t2,t4 代表进入 if 结构,t13,t17 代表退出 if 结构.t3 代表一轮循环的开始,t5 代表一轮循
                 环的结束,t12 代表退出循环.
   42   43   44   45   46   47   48   49   50   51   52