首页 > 解决方案 > 锁定为实体成员与同步(最佳实践)

问题描述

假设我有一个 EntityPool。从池中获取实体后,我需要以线程安全的方式修改实体。所以我看到了 2 个选择:

1)使用同步:

Entity e = pool.getById(id); 
synchronized (e) {
    // modifying e
}

2)给Entity类加一个锁并使用它:

Entity e = pool.getById(id);
Lock l = e.getLock();
try {
    l.lock();
    // modifying e
} finally {
    l.unlock();
}

我听说我应该避免使用“同步”关键字。我应该改用锁吗?但对我来说,Entity 类应该知道关于同步的任何事情对我来说似乎很奇怪。

标签: javamultithreadingoopsynchronizationlocking

解决方案


有不同的用例来证明这两种方法的合理性。

1 很常见。它使用对象本身作为锁,因此实体上的任何同步方法以及任何其他同步访问都被序列化。它也不需要使实体类具有锁定意识。

2 要求您将锁嵌入到实体类中。这允许您以更细粒度的方式控制同步。例如,您可以使用锁来控制对对象状态子集的访问,同时保持访问对象其他部分的方法无锁。

如果您知道自己在做什么,则无需避免使用 synchronized 关键字。锁也可以这样说。


推荐阅读