2012-03-16 118 views
0

有关Java中“最佳实践”的快速疑问。假设你有一个数据库对象,数据库的主要数据结构是一个映射。此外,假设您想同步地图的任何获取/设置信息。同步访问/修改地图的每种方法是更好吗,还是每次修改/访问时都希望在地图周围创建同步块?与数据库同步

+1

你的意思是在概念意义的数据库?或者像SQL数据库那样的数据库? – corsiKa 2012-03-16 01:20:13

+0

概念的意思,我应该澄清... – Sal 2012-03-16 01:20:52

+0

其实,我认为对此的答案是我的问题的后一个建议。从理论上讲,即使一些方法是同步的,也可能同时启动不同的方法,修改地图,对吧? – Sal 2012-03-16 01:22:21

回答

2

取决于你的工作单元的范围,需要是原子的。如果您有一个执行多个操作的进程来表示单个状态更改,那么您希望在Map对象上同步整个进程。如果您正在同步每个单独的操作,多个线程仍然可以在读取和写入时相互交错。这就像在读取未提交模式下使用数据库游标一样。您可能会根据其他线程的半完成工作做出决定,查看不完整/不正确的数据状态。

(当然插入强制性建议使用类来自java.util.concurrent.locks代替synchronized关键字:))

1

在一般情况下,最好选择非私人方法的private final Object,而不是private synchronized方法。这样做的基本原理是,你不希望胭脂主叫方向你的方法传递一个输入并获得你的锁定。对于private方法,您可以完全控制如何调用它们。我个人不使用​​方法,而是将方法封装在synchronized()块中。这给我更严格的控制,并防止外部来源窃取我的显示器。我想不出你想要为你的显示器提供外部源访问的情况,但是如果你愿意,你可以将它们的锁对象传递给它们。但就像我说的,我会避免这种情况。