当有人说“结果不是线程安全”时,它意味着什么

时间:2013-04-04 20:40:59

标签: java multithreading hbase

当我阅读这篇文档时,我正在编写一个特定于应用程序的Java HBase API包装器:

http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Result.html

它说This class is **NOT THREAD SAFE**.

不确定线程​​是什么意思。我基本上是一个C ++程序员,如果有人说函数strtok()不是线程安全的,我就不会在多线程环境中使用它。像strtok()这样的东西使用静态变量,并且通过两个不同的线程调用这个函数不是一个好主意。

JAVA是否一样?

我有一个功能:

public String get(String key, String family) {
    Get get = new Get(key.getBytes());
    get.addFamily(family.getBytes());

    Result result = null;
    try {
        result = _table.get(get);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return "";
}

函数get可能被多个线程调用。它会以某种方式使结果不安全吗?

3 个答案:

答案 0 :(得分:4)

  

非线程安全的确切含义是什么。

这意味着如果通过各种Threads访问给定的类对象,则在Threads内调用其方法可能会导致不可预测的结果,因为各种{{1}之间的不需要的交互}。这种不可预测结果的基本原因是在Threads之间共享dataobject。您可以在Wikipedia Article查看此处以了解有关线程安全的更多信息。

完成代码后,我发现您在第threads行中使用了成员变量_table。所以,很可能不是result = _table.get(get);

答案 1 :(得分:3)

如果某个类“不是线程安全的”,则多个线程无法在没有其他同步的情况下调用其方法(在同一实例上)。例如,您不能同时在一个线程中迭代ArrayList,并在其他线程中修改其内容。

在你的情况下它应该不是问题,因为在每次调用函数时都会创建Result的新实例,因此这些线程在不同的Result对象上运行。

答案 2 :(得分:0)

当您读到Result不是线程安全时,这意味着如果您有多个线程可以访问此结果对象的情况,您需要确保使用已同步(请参阅here以获取同步方法的列表访问)。

如果您的代码保持原样,即每次调用get都会生成自己的结果新实例,您就可以了。如果您在对象中的调用之间保留此Result实例,并且它将在多个调用中使用,则您需要保护对该Result对象的访问

相关问题