Java 当有人说“什么意思?”;结果不是线程安全的”;

Java 当有人说“什么意思?”;结果不是线程安全的”;,java,multithreading,hbase,Java,Multithreading,Hbase,当我阅读本文档时,我正在Java HBase API上编写一个特定于应用程序的包装: 它说这个类**不是线程安全的**。 不线程安全到底意味着什么。我基本上是C++程序员,如果有人说函数 Sttok[])/Cuth>不是线程安全的,我不会在多线程的Env中使用它。它类似于strtok()使用静态变量,由两个不同的线程调用此函数不是一个好主意 在JAVA方面也是这样吗 我有一个功能: public String get(String key, String family) { Get g

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

它说
这个类**不是线程安全的**。

不线程安全到底意味着什么。我基本上是C++程序员,如果有人说函数<代码> Sttok[])/Cuth>不是线程安全的,我不会在多线程的Env中使用它。它类似于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=\u table.get(get)行中使用了一个成员变量
\u table
。因此,很可能它不是线程安全的。如果一个类是“非线程安全的”,那么它的方法在没有额外同步的情况下不能被多个线程调用(在同一个实例上)。例如,不能同时在一个线程中迭代ArrayList,而在另一个线程中修改其内容


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

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


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

也许您可以在这里找到答案:不幸的是,一件事情可能在许多不同的方面“不线程安全”。要获得明确的答案,您必须询问作者。您的方法中的
\u table
是什么?\u table是我从HTablePool获得的HTableInterface。有关系吗:O?