在谈到Java中的并发性时,我在接受采访时被问到以下问题。我无法想出一个好的策略。有什么想法吗?
如何在不同步代码的情况下共享对java资源的访问权限?
答案 0 :(得分:7)
如果资源是不可变的,那么不需要同步,但除此之外,这里有一些想法:
限制对只读的所有访问:如果没有更新资源,那么任意数量的并发线程都可以安全地拥有对它的读取权限。
复制每个订阅者的资源:任意数量的线程都可以拥有自己的资源副本并安全地修改它,而不会影响具有自己副本的其他线程。 (例如ThreadLocal
)
使用原子引用来模拟同步:“getter”方法使用检查原子引用(例如AtomicBoolean
)来创建“签入”/“签出“系统确保只有一个线程可以访问资源,不需要同步。
使用来自java.util.concurrent.locks
的锁定:可以提供相同(甚至更好)的功能,而无需使用synchronized
关键字。
当然,面试官可能会施加额外的限制,但鉴于你问题中的信息很少,这些都是很好的起点。
答案 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?
)