Java Bitset - “非线程安全”的完整含义是什么

时间:2016-08-22 09:13:12

标签: java multithreading thread-safety bitset

我知道java.util.BitSet操作不是线程安全的。只有在并行线程中读取和写入BitSet会导致永久性(在当前应用程序运行时)信息丢失吗?或者写操作正确执行,只有当前的并行读操作可能返回错误的信息,后来的读操作返回正确的信息。换句话说,我的意思是,如果我只是同步写操作并允许写操作与读操作并行运行,那么某些信息是否会永久丢失?

2 个答案:

答案 0 :(得分:0)

当你谈论标准的Java库类时,你应该按照javadoc的说法去做。

有些用户在不同的操作系统版本上运行来自不同供应商的不同JRE版本。您不能依赖于Bitset或任何其他库类的行为在每个环境中完全相同,但您可以依赖它来执行Javadoc所说的任何事情会做的。

  

如果我只是同步写操作并允许写操作与读操作并行运行,那么某些信息是否会永久丢失?

重叠读取操作或与单个写入操作重叠的读取可能会使Bitset(或任何其他对象)处于某种无效状态。如果您认为您的应用程序可以处理读取可能返回的错误结果,那么这可能是一个合理的风险,

BUT

某些同步读取会导致性能问题吗?如果您还没有真正衡量性能,并且您还没有发现未同步和同步之间的差异使得可接受的性能和不可接受的性能之间存在差异,那么为什么不同步所有访问?

其他方式被称为“过早优化"”,而且往往浪费你自己的时间。

答案 1 :(得分:-1)

如果没有外部同步,BitSet对于多线程使用是不安全的。

请阅读本文,以便对读者作家问题有基本的了解。

https://dzone.com/articles/java-concurrency-read-write-lo

只有READING不会导致concurreny中的任何问题。 当您同时访问信息时,READ / WRITE或WRITE / WRITE会导致不一致的问题