java - 锁定为实体成员与同步(最佳实践)
问题描述
假设我有一个 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 类应该知道关于同步的任何事情对我来说似乎很奇怪。
解决方案
有不同的用例来证明这两种方法的合理性。
1 很常见。它使用对象本身作为锁,因此实体上的任何同步方法以及任何其他同步访问都被序列化。它也不需要使实体类具有锁定意识。
2 要求您将锁嵌入到实体类中。这允许您以更细粒度的方式控制同步。例如,您可以使用锁来控制对对象状态子集的访问,同时保持访问对象其他部分的方法无锁。
如果您知道自己在做什么,则无需避免使用 synchronized 关键字。锁也可以这样说。
推荐阅读
- cmd - 如何通过 NSSM 或 cmd 停止、重启、暂停、恢复?
- sql-server - Microsoft SQL Server 上的数据库静态角色和凭证轮换
- git - Visual Studio 的 git.exe 位置在哪里?
- java - 我想编写一个代码来使用 java 验证不同类型的日期,但是带有 T 和 Z 的日期仍然显示 Invalid
- python - 如何使 Power Bi 网站版中的 python 图表看起来像桌面版?
- php - 命名空间声明中的别名命名空间,而不是 PHP 中的命名空间导入可能吗?
- numpy - 在 Julia 中破坏 Iterator.product
- angular - 如何编写登录服务的单元测试用例
- shopify - 使用 Alteryx Designer 下载工具从 shopify 中检索所有产品
- google-apps-script - 使用 Google Apps 脚本对服务器错误进行错误处理