关于Java中的“最佳实践”的快速问题。假设您有一个数据库对象,数据库的主数据结构是一个映射。此外,假设您想要同步地图的任何获取/设置信息。是同步访问/修改地图的每个方法更好,还是每次修改/访问地图时都围绕地图创建同步块?
发布于 2012-03-16 09:23:27
这取决于需要原子化的工作单元的范围。如果您的进程执行代表单个状态更改的多个操作,那么您希望在Map对象上同步该整个进程。如果您正在同步每个单独的操作,则多个线程仍然可以在读取和写入时相互交错。这就像在读未提交模式下使用数据库游标一样。您可能会根据其他一些线程半完成的工作做出决定,看到不完整/不正确的数据状态。
(当然,插入强制性建议,使用来自java.util.concurrent.locks的类,而不是synchronized关键字:)
发布于 2012-03-16 09:22:47
在一般情况下,对于非私有方法,最好在private final Object上进行同步,而不是使用private synchronized方法。这样做的理由是,您不希望rouge调用者将输入传递给您的方法并获取您的锁。对于private方法,您可以完全控制如何调用它们。
就我个人而言,我避免使用synchronized方法,而是将该方法封装在synchronized()块中。这给了我更严格的控制,并防止外部来源窃取我的监视器。我想不出在什么情况下,您会想要提供对监视器的外部源代码访问,但如果您这样做了,您可以将锁对象传递给它们。但就像我说的,我会避免这种情况。
https://stackoverflow.com/questions/9730528
复制相似问题