首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当有人说“结果不是线程安全的”是什么意思?

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

Stack Overflow用户
提问于 2013-04-05 04:40:59
回答 3查看 348关注 0票数 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时,这是相同的吗?

我有一个函数:

代码语言:javascript
复制
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函数可能会被多个线程调用。它会不会使结果使用起来不安全?

EN

回答 3

Stack Overflow用户

发布于 2013-04-05 04:43:28

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

这意味着如果给定的类对象是通过不同的Threads访问的,那么在这些Threads中调用它的方法可能会导致不可预知的结果,因为不同的Threads之间会发生不必要的交互。导致这种不可预知结果的根本原因是同一个objectdata在不同的threads之间共享。你可以在这里查看Wikipedia Article了解更多关于线程安全的知识。

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

票数 4
EN

Stack Overflow用户

发布于 2013-04-05 04:49:36

如果一个类“不是线程安全的”,那么如果没有额外的同步,它的方法就不能被多个线程调用(在同一个实例上)。例如,您不能同时在一个线程中迭代ArrayList,同时在另一个线程中修改它的内容。

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

票数 3
EN

Stack Overflow用户

发布于 2013-04-09 17:40:25

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15821293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档