2017-05-24 40 views
1

有人问我一个编码采访时这样的问题,一个Java对象同步:如何使用〜100个原始域

假设你有一台Linux机器上运行多个Java服务 - 这将是同步的一个好办法这些服务之间具有〜100个原始字段的Java对象实时?提供至少两种解决方案,并比较每种解决方案的优缺点。

并发并不是我最强烈的观点,所以深入的解释将不胜感激。提前致谢!

+0

作为旁注:实时Java需要一个实时JVM,如[JamaicaVM](https://www.aicas.com/cms/en/JamaicaVM)。我也不知道原始字段与实际问题有什么关系。我想说你需要更多的信息(例如谁写/读什么)。 – beatngu13

回答

0

一种方式做到这一点是做对的字段级别的同步,但是这意味着你将有相应的对象到您的原语锁定机制(例如使用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实例)上的锁,而是同步每个私有对象上完成(字段),以便在尝试在同一个字段上操作时线程只会被阻塞。

0

我并不是说这是“最好”的方法,但一种选择是将对象持久化到数据库并让服务读/写。

使用像Hibernate这样的ORM库,您可以使用@Version批注并定义一个版本字段,以确保服务在更新之前需要具有最新版本的对象。你也可以使用数据库锁定。

在利弊方面,你需要考虑:

  • 请问这个解决方案工作做好时,有大量的并发写入?
  • 当有大量并发读取但写入不多时,此解决方案是否能正常工作?
  • 当大多数写入包含对对象字段的许多变化时,此解决方案是否可以正常工作?
  • 当大多数写入包含对单个字段的更改时,此解决方案是否可以正常工作?
  • 服务需要多长时间才能锁定对象?

你应该考虑在Hibernate的可用讨论时,你的答案