如何在不同步代码的情况下共享对java资源的访问?

iri*_*guy 0 java concurrency

在谈到Java中的并发性时,我在接受采访时被问到以下问题.我无法想出一个好的策略.有任何想法吗?

如何在不同步代码的情况下共享对java资源的访问?

mae*_*ics 7

如果资源是不可变的,那么不需要同步,但除此之外,这里有一些想法:

  1. 限制对只读的所有访问:如果没有更新资源,那么任何数量的并发线程都可以安全地具有对它的读访问权.

  2. 复制每个订阅者的资源:任意数量的线程都可以拥有自己的资源副本并安全地修改它,而不会影响具有自己副本的其他线程.(例如ThreadLocal)

  3. 使用原子引用来模拟同步:"getter"方法使用检查原子引用(例如AtomicBoolean)来创建"签入"/"签出"系统,以确保只有一个线程可以访问资源,不需要同步.

  4. 使用锁定java.util.concurrent.locks:可以提供相同(甚至更好)的功能,而无需使用synchronized关键字.

当然,面试官可能会施加额外的限制,但鉴于你问题中的信息很少,这些都是很好的起点.