有一个规则可以肯定地找出,所有可能在Java程序中有并发访问的对象?我的意图是使用这样的规则(如果存在的话)找出哪些Java类可能具有并发访问并确保它们是线程安全的。在检查大型Java项目时,此规则可能非常有用。我曾经想过寻找静态方法,但我不确定这是多线程访问对象的唯一方式。有一个规则可以找出哪些对象可能在Java程序中具有并发访问权限?
回答
看起来很不可能这样的事情存在作为单个规则。想象一下以下内容:
public void maybeAccessConcurrently(Program x) {
if(halts(x)) {
accessConcurrentObject();
} else {
// don't.
}
}
我不知道你,但类型简单的检查我真的不能图谋的规则是不等同于这里决定停机问题,特别是不或声明。我认为您可能会发现,像其他静态分析技术一样,您可以在合理范围内检查一组属性。 Bandera project似乎是努力使用各种模型检查技术来验证并发Java代码的属性。可能还有其他类似的努力(考虑到并发的存在,所有这些努力都最有可能涉及模型检查)。
有助于检测可能受到并发访问的类的规则集也会有所帮助。 – 2010-08-20 13:22:21
在收集许多错误肯定(以及一些错误否定)的风险下,您将在这种情况下基本上需要构建依赖关系图,然后尝试隔离不同线程内的不相交部分的代码。我认为使用一些并发的模型检查软件,比如我链接的模型检查软件可能会更容易,更容易。 – Gian 2010-08-20 13:26:02
不,不可能通过查看方法签名来确定这一点。没有规则只有静态方法可以给出并发问题。
如果两个线程共享对相同对象的引用,可以是直接引用(通过对同一对象进行引用),也可以是间接引用(通过静态对象,静态方法,所使用对象的成员等)。 )。使用代码的静态分析来检测这些情况并不总是可能的。
我想过去找静态 方法,但我不知道这是 的唯一途径,对象可以是 多个线程访问。
不,静态方法根本无法帮到你。你甚至没有限制对象。即使访问原语也可能不是线程安全的。例如,增加一个long可能不是一个原子操作,这取决于你正在运行的平台。阿法克你问的是不可能的。
我怀疑这样(方便)的规则是可能的。试想一下:
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”应用程序被使用过类有并发访问 - 因为你可以在不同的线程,并启动应用程序几次将永远不知道哪个类是开始的(信息隐藏在字符串文字中)以及其他什么类可以实例化。
是的,它是非常有可能做出这样的规则,
public static boolean canBeAccessedConcurrently(Object arg){
return true;
}
哈哈,真的。虽然你可能想接受一个对象来匹配OP的问题。 – 2010-08-20 13:20:12
我喜欢这个。让我想起我最喜欢的随机数字生成器:http://xkcd.com/221/ :-) – 2010-08-20 13:21:13
+1为hilarity :) – 2010-08-20 13:49:19
退房静态代码分析FindBugs和PMD。他们有很多规则可以帮助找到潜在的并发问题。两者都可以从命令行运行,因此您可以将它们合并到您的构建中,并且如果规则被违反,构建会被破坏。
- 1. DotNetFactory可以访问哪些对象?
- 2. 有些环境变量可以访问,有些则不可以?
- 3. PHP类与具有对象是可访问这些对象
- 4. 在我的所有应用程序类中都可以访问一个对象
- 5. 找出哪些用户在邮箱上拥有完全访问权限
- 6. 有没有规则可以发现UB?
- 7. WebKit可以访问哪些功能?
- 8. 如何找出java程序可以侦听哪些网址
- 9. 是否有可能在JavaScript中捕获财产访问权限?
- 10. jjs中有哪些对象可用?
- 11. 如果没有管理员权限,您可以获得哪些注册表访问权限?
- 12. 解决此并发问题的可能设计有哪些?
- 13. 获取哪些用户具有管理员权限的帐户(具有OAuthV2访问权限)的API是什么?
- 14. Firebase安全规则可以检查某人是否具有特定的访问权限?
- 15. 有没有办法找到Java程序访问哪些内存地址以及按什么顺序访问?
- 16. 限制哪些功能可以修改对象
- 17. 没有管理员权限的用户是否可以管理配置单元中的对象访问权限?
- 18. 可以打印出一个对象,但不能在JS中访问它的值
- 19. 找出哪些接口可以查询COM对象?
- 20. Can Yii2 RBAC权限有多个规则?
- 21. Java - 你可以有多少个对象?
- 22. 我能找出哪些文件可以被我的OS X沙箱访问吗?
- 23. 是否有可能在Android中拥有“可选”权限?
- 24. 找出哪个权限从哪个库中合并
- 25. 找出在expando对象上访问哪些属性
- 26. 有人可以在这个Java程序中发现错误
- 27. Rails和Sequel中的值规范化有哪些工具可用?
- 28. Android服务可以有多个权限?
- 29. 子类访问静态成员有哪些规则?
- 30. 是否可以限制哪些程序可以启动wpf应用程序?
目标是找出不是线程安全但应该是的类。我曾经考虑过检查静态方法,因为它是提供共享对象的常用方法,就像对象工厂和单例一样。 – 2010-08-20 13:17:16