【发布时间】:2015-01-22 06:52:05
【问题描述】:
我想知道一个类是否有任何非线程安全的字段,这样我就不会将它们缓存在我的工厂中。
我编写了一个示例代码来测试一个类是否具有非线程安全的潜在字段。
final class ObjectStateChecker {
public void isStateful(@NotNull Class<?> objectType) {
for (Field field : Arrays.asList(objectType.getDeclaredFields())) {
System.out.println("Field: " + field.getName());
int modifiers = field.getModifiers();
System.out.println("Modifier: " + modifiers);
if (!Modifier.isFinal(modifiers)) {
System.out.println("Field " + field + " is final.");
} else {
System.out.println("Field " + field + " is not final.");
}
}
}
private class Student {
private String name;
private final int age;
private static final int SOME_VALUE = 1;
private Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
}
public static void main(String[] args) {
ObjectStateChecker objectStateChecker = new ObjectStateChecker();
Student student = objectStateChecker.new Student("Ram", 23);
objectStateChecker.isStateful(student.getClass());
}
}
如何增强 isStateful() 方法?目标是找出Class<?> 是否有任何潜在的非线程安全字段,以便我不会缓存它们。
更新: 除了检查公共同步方法之外,我还有什么需要考虑的吗?我认为所有 final 和 static 字段都是线程安全的,除非它们是不同步的集合。
我认为一定有一些图书馆做过类似的事情。对此类库的任何引用也很有用。我知道依赖注入容器。有没有这样的容器有我可以使用的有用的代码示例?
【问题讨论】:
-
你可以另外检查,如果所有公共方法都同步了,那么所有字段都是安全的。
-
上面的代码有什么问题/有什么问题?
-
@ErwinBolwidt 我不确定要检查的所有可能条件。
-
@Vitaly 谢谢。除了检查公共同步方法之外,我还有什么需要考虑的吗?我认为所有 final 和 static 字段都是线程安全的,除非它们不是未同步的集合
-
@BRS “线程安全”是什么意思?你应该从那开始。很难以有用的方式定义它。请注意,例如,同步类的所有公共字段并不意味着我不能编写涉及该类的多线程竞争条件。但是如果对“线程安全”的定义足够狭隘,您也许可以做出一些事情。
标签: java multithreading thread-safety pojo