2010-08-20 63 views
0

有一个规则可以肯定地找出,所有可能在Java程序中有并发访问的对象?我的意图是使用这样的规则(如果存在的话)找出哪些Java类可能具有并发访问并确保它们是线程安全的。在检查大型Java项目时,此规则可能非常有用。我曾经想过寻找静态方法,但我不确定这是多线程访问对象的唯一方式。有一个规则可以找出哪些对象可能在Java程序中具有并发访问权限?

+0

目标是找出不是线程安全但应该是的类。我曾经考虑过检查静态方法,因为它是提供共享对象的常用方法,就像对象工厂和单例一样。 – 2010-08-20 13:17:16

回答

2

看起来很不可能这样的事情存在作为单个规则。想象一下以下内容:

public void maybeAccessConcurrently(Program x) { 
    if(halts(x)) { 
     accessConcurrentObject(); 
    } else { 
     // don't. 
    } 
} 

我不知道你,但类型简单的检查我真的不能图谋的规则是不等同于这里决定停机问题,特别是或声明。我认为您可能会发现,像其他静态分析技术一样,您可以在合理范围内检查一组属性。 Bandera project似乎是努力使用各种模型检查技术来验证并发Java代码的属性。可能还有其他类似的努力(考虑到并发的存在,所有这些努力都最有可能涉及模型检查)。

+0

有助于检测可能受到并发访问的类的规则集也会有所帮助。 – 2010-08-20 13:22:21

+1

在收集许多错误肯定(以及一些错误否定)的风险下,您将在这种情况下基本上需要构建依赖关系图,然后尝试隔离不同线程内的不相交部分的代码。我认为使用一些并发的模型检查软件,比如我链接的模型检查软件可能会更容易,更容易。 – Gian 2010-08-20 13:26:02

1

不,不可能通过查看方法签名来确定这一点。没有规则只有静态方法可以给出并发问题。

如果两个线程共享对相同对象的引用,可以是直接引用(通过对同一对象进行引用),也可以是间接引用(通过静态对象,静态方法,所使用对象的成员等)。 )。使用代码的静态分析来检测这些情况并不总是可能的。

2

我想过去找静态 方法,但我不知道这是 的唯一途径,对象可以是 多个线程访问。

不,静态方法根本无法帮到你。你甚至没有限制对象。即使访问原语也可能不是线程安全的。例如,增加一个long可能不是一个原子操作,这取决于你正在运行的平台。阿法克你问的是不可能的。

1

我怀疑这样(方便)的规则是可能的。试想一下:

public MyRunnable implements Runnable { 
    public run() { 
    Class.forName("com.example.MainClass").newInstance(); 
    } 
} 

后来

public class MainClass { 
    public MainClass() { 
    startApplication(); 
    } 

    public static startApplication() { 
    // A huge application is started 
    } 
} 

现在每次在执行“MainClass”应用程序被使用过类有并发访问 - 因为你可以在不同的线程,并启动应用程序几次将永远不知道哪个类是开始的(信息隐藏在字符串文字中)以及其他什么类可以实例化。

5

是的,它是非常有可能做出这样的规则,

public static boolean canBeAccessedConcurrently(Object arg){ 
     return true; 
} 
+0

哈哈,真的。虽然你可能想接受一个对象来匹配OP的问题。 – 2010-08-20 13:20:12

+0

我喜欢这个。让我想起我最喜欢的随机数字生成器:http://xkcd.com/221/ :-) – 2010-08-20 13:21:13

+0

+1为hilarity :) – 2010-08-20 13:49:19

2

退房静态代码分析FindBugsPMD。他们有很多规则可以帮助找到潜在的并发问题。两者都可以从命令行运行,因此您可以将它们合并到您的构建中,并且如果规则被违反,构建会被破坏。

相关问题