我有一个SinglePDFPage对象数组,它们只是包装对象,每个对象都包含一个WritableImage对象。
在子线程内部的循环中填充它时,我仍然可以访问线程外部的数组。字面上同时。我正在渲染WritableImage对象,每个对象都包含一个PDF页面。这大约需要半秒钟。
在填充该数组时,我可以访问它并在子线程循环到达之前对某个页面进行预渲染。
我已阅读有关volatile
关键字和同步集合的内容;如果您有不同线程访问的对象,我认为这是必需的。我以为通常将对象写入线程存储?如果是这样,为什么我可以在没有任何锁定或同步的情况下访问它们?
所描述的模式是否是"线程安全的"?
答案 0 :(得分:1)
这个问题有点抽象,所以我会在抽象层面上发言。
线程安全并不是指跨线程访问数据的能力。它指的是安全,也就是说,其他线程无法以无效状态查看数据。您的代码不是线程安全的,因为其他线程在完全填充之前可以看到您的数组。 volatile
,synchronized
,并发集合和实用程序是工具,可帮助您控制对线程之间共享状态的访问。