当我阅读这篇文档时,我正在编写一个特定于应用程序的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可能被多个线程调用。它会以某种方式使结果不安全吗?
答案 0 :(得分:4)
非线程安全的确切含义是什么。
这意味着如果通过各种Threads
访问给定的类对象,则在Threads
内调用其方法可能会导致不可预测的结果,因为各种{{1}之间的不需要的交互}。这种不可预测结果的基本原因是在Threads
之间共享data
个object
。您可以在Wikipedia Article查看此处以了解有关线程安全的更多信息。
完成代码后,我发现您在第threads
行中使用了成员变量_table
。所以,很可能不是result = _table.get(get);
。
答案 1 :(得分:3)
如果某个类“不是线程安全的”,则多个线程无法在没有其他同步的情况下调用其方法(在同一实例上)。例如,您不能同时在一个线程中迭代ArrayList,并在其他线程中修改其内容。
在你的情况下它应该不是问题,因为在每次调用函数时都会创建Result的新实例,因此这些线程在不同的Result对象上运行。
答案 2 :(得分:0)
当您读到Result不是线程安全时,这意味着如果您有多个线程可以访问此结果对象的情况,您需要确保使用已同步(请参阅here以获取同步方法的列表访问)。
如果您的代码保持原样,即每次调用get都会生成自己的结果新实例,您就可以了。如果您在对象中的调用之间保留此Result实例,并且它将在多个调用中使用,则您需要保护对该Result对象的访问