有人问我一个编码采访时这样的问题,一个Java对象同步:如何使用〜100个原始域
假设你有一台Linux机器上运行多个Java服务 - 这将是同步的一个好办法这些服务之间具有〜100个原始字段的Java对象实时?提供至少两种解决方案,并比较每种解决方案的优缺点。
并发并不是我最强烈的观点,所以深入的解释将不胜感激。提前致谢!
有人问我一个编码采访时这样的问题,一个Java对象同步:如何使用〜100个原始域
假设你有一台Linux机器上运行多个Java服务 - 这将是同步的一个好办法这些服务之间具有〜100个原始字段的Java对象实时?提供至少两种解决方案,并比较每种解决方案的优缺点。
并发并不是我最强烈的观点,所以深入的解释将不胜感激。提前致谢!
一种方式做到这一点是做对的字段级别的同步,但是这意味着你将有相应的对象到您的原语锁定机制(例如使用Integer
而不是int
)。所以,您的实现看起来是这样的:
public class SomeSynchronizedClass {
private Integer field1;
private Double field2;
....
public void doSomethingWithField1() {
synchronized(field1) {
// do something to field1 here
}
}
public void doSomethingWithField2() {
synchronized(field2) {
// do something to field2 here
}
}
}
注意,这个方法是不同步的,因为这将持有的对象本身(的SomeSynchronizedClass
实例)上的锁,而是同步每个私有对象上完成(字段),以便在尝试在同一个字段上操作时线程只会被阻塞。
我并不是说这是“最好”的方法,但一种选择是将对象持久化到数据库并让服务读/写。
使用像Hibernate这样的ORM库,您可以使用@Version
批注并定义一个版本字段,以确保服务在更新之前需要具有最新版本的对象。你也可以使用数据库锁定。
在利弊方面,你需要考虑:
你应该考虑在Hibernate的可用讨论时,你的答案
作为旁注:实时Java需要一个实时JVM,如[JamaicaVM](https://www.aicas.com/cms/en/JamaicaVM)。我也不知道原始字段与实际问题有什么关系。我想说你需要更多的信息(例如谁写/读什么)。 – beatngu13