关于Java中“最佳实践”的快速问题。假设您有一个数据库对象,将数据库的主数据结构作为映射。此外,假设您想要同步地图的任何获取/设置信息。是否更好地同步访问/修改地图的每个方法,或者您是否希望每次修改/访问时在地图周围创建同步块?
答案 0 :(得分:2)
取决于您需要原子的工作单元的范围。如果您的进程执行多个表示单个状态更改的操作,那么您希望在Map对象上同步整个进程。如果要同步每个单独的操作,多个线程仍然可以在读取和写入时相互交错。这就像在read-uncommitted模式下使用数据库游标一样。您可以根据其他一些线程半完成工作做出决定,看到不完整/不正确的数据状态。
(当然插入强制性建议来使用java.util.concurrent.locks
中的类而不是synchronized关键字:))
答案 1 :(得分:1)
在一般情况下,对于非私有方法,最好在private final Object
上进行同步,而不是使用private synchronized
方法进行同步。这样做的理由是,您不希望胭脂调用者将输入传递给您的方法并获取锁定。对于private
方法,您可以完全控制它们的调用方式。
就个人而言,我避免使用synchronized
方法,而是将方法封装在synchronized()
块中。这使我可以更严格地控制并防止外部来源窃取我的显示器。我想不出你想要为你的显示器提供外部源访问的情况,但如果你这样做,你可以改为将你的锁对象传递给它们。但就像我说的那样,我会避免这种情况。