java - 访问B类中的A类字段时Java同步块
问题描述
我想问与Java同步相关的问题并澄清我的疑问,我编写了如下简单的代码:
class A {
public int variable;
public int secondVariable;
public Object variableLock = new Object();
public Object secondVariableLock = new Object();
public void doingSthWithVariable() {
synchronized (variableLock) {
.... } }
public void doingSthWithVariableInOtherMethod() {
synchronized (variableLock) {
.... } }
public void doingSthWithSecondVariable() {
synchronized (secondVariableLock) {
.... } }
public void doingSthWithSecondVariableInOtherMethod() {
synchronized (secondVariableLock) {
.... } }
}
class B {
public A instanceOfA;
public void doingSthWithAVariables() {
synchronized (instanceofA.variableLock) {
synchronized (instanceofA.secondVariableLock) {
....} } }
}
我的问题是:如果它是安全的,并且在 B 类中使用 A 类的 variableLock/secondVariableLock 是一个好习惯吗?我的意思是,我需要在 B 类的实例中阻止这两个变量的任何更改,我想知道这是否是一个好方法。还有一个问题:如果我在多个 B 对象中有相同的 instanceOfA 怎么办?
在我看来,答案是肯定的(这不是不安全的),但我只是想确保并询问更好的方法来做到这一点。
解决方案
更常见的方法是实例化一个 ReadWriteLock 并从中生成两个写锁,并在 A 和 B 中使用它们。A 的同一个实例将共享相同的锁
推荐阅读
- go - 接收map接口而不是struct
- c# - 如何使用 ASP.NET Core Web API 和 mongo db 检查字段是否包含在集合中
- node.js - 如何在 NodeJS 中实现自动更新
- angular - 如何让 Firebase 文档的某些数据只能由具有“管理员”状态的用户编辑?
- django - 嵌套序列化器中的 DRF 文件上传
- tensorflow - 用于张量流的 Scikit-Learn 包装器不适用于 Celery-Redis
- python - 在 python 中使用 statsmodels.sandbox.regression.gmm.GMM 的问题
- java - 使用soapui-maven-plugin时无法执行拆卸脚本
- python - 运行线程任务导致意外错误
- json - 无法读取数据,因为它的格式不正确。快速5 json