繁体   English   中英

锁定为实体成员与同步(最佳实践)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM