有一条规则可以找出Java程序中哪些对象可能具有并发访问权限?
当然,有一条规则可以找出Java程序中可能具有并发访问权限的所有对象?我的意图是使用这样的规则(如果存在的话),找出哪些Java类可能具有并发访问权限,然后保证它们是线程安全的。在检查大型Java项目时,此规则可能非常有用。我曾想过寻找静态方法,但我不确定这是否是多线程访问对象的唯一方式。不,不可能通过查看方法签名来确定这一点。没有规定只有静态方法才能产生并发问题有一条规则可以找出Java程序中哪些对象可能具有并发访问权限?,java,multithreading,concurrency,thread-safety,Java,Multithreading,Concurrency,Thread Safety,当然,有一条规则可以找出Java程序中可能具有并发访问权限的所有对象?我的意图是使用这样的规则(如果存在的话),找出哪些Java类可能具有并发访问权限,然后保证它们是线程安全的。在检查大型Java项目时,此规则可能非常有用。我曾想过寻找静态方法,但我不确定这是否是多线程访问对象的唯一方式。不,不可能通过查看方法签名来确定这一点。没有规定只有静态方法才能产生并发问题 如果两个线程共享对相同对象的引用,也可能会出现问题,直接(通过给定对相同对象的引用)或间接(通过静态对象、静态方法、所用对象的成员等
如果两个线程共享对相同对象的引用,也可能会出现问题,直接(通过给定对相同对象的引用)或间接(通过静态对象、静态方法、所用对象的成员等)。使用对代码的静态分析来检测这些情况并不总是可能的。这样的事情似乎不太可能作为单一规则存在。想象一下:
public void maybeAccessConcurrently(Program x) {
if(halts(x)) {
accessConcurrentObject();
} else {
// don't.
}
}
我不知道你的情况,但我真的无法设计出一个规则,它不等同于在这里决定暂停问题,特别是不通过简单的类型或声明检查。我认为您可能会发现,与其他静态分析技术一样,您可以在合理的范围内检查一组属性。这似乎是为了使用各种模型检查技术来验证并发Java代码的属性。可能还有其他类似的工作(考虑到并发的存在,所有这些工作都很可能涉及模型检查)
我想找静电干扰
方法,但我不确定这是否正确
一个物体可以移动的唯一方法
可由多个线程访问
不,静态方法根本帮不了你。你甚至不局限于对象。甚至对原语的访问也可能不是线程安全的。例如,根据您运行的平台,增加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;
}
查看静态代码分析器和PMD。它们有很多规则,有助于发现潜在的并发问题。这两个类都可以从命令行运行,因此您可以将它们合并到构建中,并在违反规则时破坏构建。目标是找出那些不是线程安全的类,但它们应该是线程安全的。我曾考虑检查静态方法,因为这是提供共享对象的常用方法,就像对象工厂和单例一样。Lol true,true。虽然你可能想接受一个对象来匹配OP的问题。我喜欢这个。这让我想起了我最喜欢的随机数生成器::-)但这也是一个很好的观点。OP最好寻找不能同时访问的类。这将是一个更小的集合,可能是空的。一组有助于检测可能遭受并发访问的类的规则也会有所帮助。冒着收集大量误报(和一些误报)的风险,在这种情况下,您基本上需要构建一个依赖关系图,然后尝试隔离不同线程中不相交的代码部分。我认为使用一些并发的模型检查软件,比如我链接的软件,可能会容易得多。