我正在学习多线程,我有一个小问题。 当我在线程之间共享一些变量(ArrayList,或者像double,float这样的其他东西)时,它是否应该被读/写中的同一个对象lcoked?我的意思是,当1个线程设置变量值时,是否可以同时读取任何问题?或者它应该被同一个对象锁定,并强制线程等待读取,直到它被另一个线程更改?
答案 0 :(得分:1)
所有对共享状态的访问必须由相同的锁保护,包括读取和写入。读操作必须等待写操作才能释放锁。
作为一种特殊情况,如果您在同步块中的所有内容完全相当于一个读取或写入操作,那么您可以省去同步块并将变量标记为易失性。
答案 1 :(得分:0)
简短:取决于。
长: 每种不同的场景都有许多“正确的答案”。 (这使编程变得有趣)
TL;博士
例如,并非所有线程编程都需要“始终正确”
这是我的建议:如果你正在学习,你应该说“为什么我需要锁?”和“为什么锁可以帮助在不同的情况下?” (不仅仅是来自教科书的给定样本),“如果失败,或者如果失去锁定会发生什么?”
答案 2 :(得分:0)
如果所有线程都在读取,则无需进行同步。
如果一个或多个线程正在读取并且一个或多个线程正在写入,则需要以某种方式进行同步。如果集合很小,您可以使用synchronized
。您可以在集合的访问周围添加synchronized
块,synchronized
访问集合的方法或使用并发线程安全集合(例如,Vector)。
如果你有一个大型集合,并且你想允许共享阅读而是独家写作,你需要使用ReadWriteLock
。请参阅此处了解JavaDoc以及您希望使用示例的详细说明:
请注意,这个问题很常见,本网站上有很多类似的例子。