【问题标题】:Array access child thread java数组访问子线程java
【发布时间】:2016-12-08 22:08:51
【问题描述】:

我有一个 SinglePDFPage 对象数组,它们只是包装器对象,每个对象都包含一个 WritableImage 对象。

在子线程内的循环中填充它时,我仍然可以访问线程外的数组。字面上同时。我正在渲染每个包含一个 PDF 页面的 WritableImage 对象。每次大约需要半秒钟。

在填充该数组时,我可以访问它并在子线程循环到达之前预渲染某个页面。

我已经阅读了volatile 关键字和同步集合;如果您有不同线程访问的对象,我认为这是必需的。我认为通常将对象写入线程存储?如果是这样,为什么我可以在没有任何锁定或同步的情况下访问它们?

所描述的模式是“线程安全的”吗?

【问题讨论】:

    标签: java arrays multithreading


    【解决方案1】:

    这个问题有点抽象,所以我将在抽象层面上解决。

    线程安全不是指跨线程访问数据的能力。它指的是这样做安全,也就是说,以这样一种方式,其他线程无法查看处于无效状态的数据。您的代码不是线程安全的,其他线程可以在完全填充之前看到您的数组这一事实表明。 volatilesynchronized、并发集合和实用程序是工具,可帮助您控制对线程之间共享状态的访问。

    【讨论】:

    • 你说得对,它有点抽象。 :) 我过去所经历的是,你必须做一些事情才能让它发挥作用。我只是对它这样工作感到惊讶,我想知道为什么。它仍然是一个类变量,所以如果它存储在主线程threadstorage中,我如何同时访问它?
    • @MasterAzazel 你为什么不能呢?
    • @MasterAzazel 我认为您可能将类与线程混淆了。类实例可以封装数据。线程没有。线程的唯一目的是执行代码。同步有助于定义线程可以执行特定代码的情况。
    • 那么在我的情况下同步或实施锁会做什么?会更好吗?我描述的方式是你应该做的吗?
    • @MasterAzazel 您实际上没有显示任何代码,但从您的描述看来,您将从同步中受益。如果您想了解所有详细信息,有很多在线教程。
    猜你喜欢
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    相关资源
    最近更新 更多