3

当我阅读此文档时,我正在为 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 可能被多个线程调用。它是否使 Result 以某种方式使用不安全?

4

3 回答 3

4

不是线程安全的到底是什么意思。

这意味着如果给定的类对象是通过各种访问的,Threads那么在其中调用它的方法Threads可能会导致不可预测的结果,因为各种Threads. 这种不可预知的结果的根本原因是data各种object之间的共享threads。您可以在此处查看Wikipedia 文章以了解有关线程安全的更多信息。

浏览完您的代码后,我看到您_table在 line中使用了一个成员变量result = _table.get(get);。所以,很可能不是Thread-safe

于 2013-04-04T20:43:28.147 回答
3

如果一个类是“非线程安全的”,则它的方法不能被多个线程调用(在同一个实例上)而无需额外的同步。例如,您不能同时在一个线程中迭代 ArrayList,并在另一个线程中修改其内容。

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

于 2013-04-04T20:49:35.757 回答
0

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

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

于 2013-04-09T09:40:25.420 回答