有一条规则可以找出Java程序中哪些对象可能具有并发访问权限?

有一条规则可以找出Java程序中哪些对象可能具有并发访问权限?,java,multithreading,concurrency,thread-safety,Java,Multithreading,Concurrency,Thread Safety,当然,有一条规则可以找出Java程序中可能具有并发访问权限的所有对象?我的意图是使用这样的规则(如果存在的话),找出哪些Java类可能具有并发访问权限,然后保证它们是线程安全的。在检查大型Java项目时,此规则可能非常有用。我曾想过寻找静态方法,但我不确定这是否是多线程访问对象的唯一方式。不,不可能通过查看方法签名来确定这一点。没有规定只有静态方法才能产生并发问题 如果两个线程共享对相同对象的引用,也可能会出现问题,直接(通过给定对相同对象的引用)或间接(通过静态对象、静态方法、所用对象的成员等

当然,有一条规则可以找出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最好寻找不能同时访问的类。这将是一个更小的集合,可能是空的。一组有助于检测可能遭受并发访问的类的规则也会有所帮助。冒着收集大量误报(和一些误报)的风险,在这种情况下,您基本上需要构建一个依赖关系图,然后尝试隔离不同线程中不相交的代码部分。我认为使用一些并发的模型检查软件,比如我链接的软件,可能会容易得多。