当我读到这个文档时,我正在编写一个基于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函数可能会被多个线程调用。它会不会使结果使用起来不安全?
发布于 2013-04-05 04:43:28
不是线程安全到底是什么意思。
这意味着如果给定的类对象是通过不同的Threads访问的,那么在这些Threads中调用它的方法可能会导致不可预知的结果,因为不同的Threads之间会发生不必要的交互。导致这种不可预知结果的根本原因是同一个object的data在不同的threads之间共享。你可以在这里查看Wikipedia Article了解更多关于线程安全的知识。
浏览完代码后,我发现您在result = _table.get(get);行中使用了成员变量_table。所以,它很可能不是Thread-safe。
发布于 2013-04-05 04:49:36
如果一个类“不是线程安全的”,那么如果没有额外的同步,它的方法就不能被多个线程调用(在同一个实例上)。例如,您不能同时在一个线程中迭代ArrayList,同时在另一个线程中修改它的内容。
在您的例子中,这应该不是问题,因为在每次调用get函数时都会创建新的Result实例,因此这些线程对不同的Result对象进行操作。
发布于 2013-04-09 17:40:25
当您读取到结果不是线程安全的时,这意味着如果您遇到多个线程可以访问此结果对象的情况,您需要确保使用是同步的(有关同步访问的方法列表,请参阅here )。
如果你的代码保持原样,也就是说,每次调用get都会生成它自己的Result的新实例,那你就没问题了。如果您在对象中的调用之间保留此结果实例,并且它将在多个调用中使用,则需要保护对该结果对象的访问
https://stackoverflow.com/questions/15821293
复制相似问题