代码之家  ›  专栏  ›  技术社区  ›  Lydon Ch

线程安全框架

  •  4
  • Lydon Ch  · 技术社区  · 14 年前

    以下类不是线程安全的(如 Proving the following code not thread safe )

    是否有一个框架可以帮助编译时/运行时分析,并告诉我们以下内容不是线程安全的?

    在编译时,理想情况下在Eclipse中,会出现一个摆动的下划线,告诉我们类不是线程安全的?

    对于运行时,是否有任何静态代码分析将类捕获为非线程安全类?

    public class LazyInitRace {
       private ExpensiveObject instance = null;
    
        public ExpensiveObject getInstance() {
        if (instance == null)
          instance = new ExpensiveObject();
        return instance;
       }
    }
    
    3 回复  |  直到 11 年前
        1
  •  4
  •   Martin    14 年前

    FindBugs 可以找到线程同步不一致的代码部分,即在一个位置同步对字段的访问,但在另一个位置不同步。它还可以对 JCIP annotations 但我相信目前只检查了@immutable。

    我不知道有什么静态分析工具可以自动捕捉到这个特定的情况,但我确信有一个存在。

        2
  •  0
  •   cletus    14 年前

    这是一个经典的问题,叫做 double checked locking problem .

    问题是你有一个 race condition 因为你要检查 instance null 并分配值。在Java中我喜欢这个问题的一个解决方案是:

    public class LazyInitRace {
      private static class Container {
        public final static ExpensiveObject INSTANCE = new ExpensiveObject();
      }
    
      public ExpensiveObject getInstance() {
        return Container.INSTANCE;
      }
    }
    

    这样做的方式是,内部类在被引用(这会使您延迟加载)之前不会被初始化,并且加载类是一个原子操作和线程安全操作。

    然而,还有其他有效的解决方案。

        3
  •  0
  •   Vipin    11 年前

    虽然这个问题被问到或回答已经很久了,但今天我在谷歌上搜索时遇到了这个问题。

    是否有一个框架可以在编译时提供帮助? /运行时分析并告诉我们以下不是线程安全的?

    www.consemplateltd.com,他们开发了先进的静态分析工具。但它不是免费的。

    在编译时,理想情况下,在Eclipse中,会出现摆动的下划线,并且 告诉我们类不是线程安全的?

    http://www.checkthread.org/index.html ,这是OpenSource项目,您可能希望看到示例 here