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

时间:2012-03-22 16:22:29

标签: java concurrency

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

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

5 个答案:

答案 0 :(得分:7)

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

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

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

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

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

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

答案 1 :(得分:2)

使资源IMMUTABLE:这是Oracle的官方java教程:http://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html

答案 2 :(得分:1)

这取决于具体情况,但我想到了什么: 使共享资源不可变或使共享资源无状态

答案 3 :(得分:0)

您可以使用Lock对象。请查看此示例:ReentrantReadWriteLock

答案 4 :(得分:0)

如果使用volatile关键字不被视为“同步代码”,那么在某些情况下它可能会有所帮助。那么如何使用已经同步的集合类(如ConcurrentHashMap或Vector?