[英]Lock as a member of entity vs synchronized (best practice)
假设我有一个 EntityPool。 从池中获取实体后,我需要以线程安全的方式修改实体。 所以我看到了 2 个选择:
1)使用同步:
Entity e = pool.getById(id);
synchronized (e) {
// modifying e
}
2) 为实体 class 添加一个锁并使用它:
Entity e = pool.getById(id);
Lock l = e.getLock();
try {
l.lock();
// modifying e
} finally {
l.unlock();
}
我听说我应该避免使用“同步”关键字。 我应该改用锁吗? 但在我看来,实体 class 应该知道任何关于同步的事情,这对我来说似乎很奇怪。
有不同的用例来证明这两种方法的合理性。
1 很常见。 它使用 object 本身作为锁,因此实体上的任何同步方法以及任何其他同步访问都被序列化。 它也不需要使实体 class 具有锁定意识。
2 要求您将锁嵌入到实体 class 中。 这允许您以更细粒度的方式控制同步。 例如,您可以使用锁来控制对 object state 子集的访问,同时保持访问 object 其他部分的方法无锁。
如果您知道自己在做什么,就没有必要避免使用 synchronized 关键字。 锁也可以这样说。
如果您的用法遵循词汇 scope,请使用“同步”。 同步在您输入synchronized
方法或synchronized {…}
子句的主体时开始,并在您离开时结束。
相比之下,锁定和解锁可以应用于任意的动作序列。 例如,您可以在调用某种“startSomething”方法时获取锁定,并在稍后调用“endSomething”方法时释放锁定。 这样做的代价是您需要确保正确性。
tl; dr - 使用synchronized
除非它显然不适用于您的用例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.