当其他线程可以访问时,从数据库更新静态映射

时间:2012-06-25 16:24:39

标签: java concurrency static

class A {
static Map<String,ColA> mapA;
static const int a = 12;
static Map<String,colB> mapB;
}

Q1&GT; 现在我需要每10分钟从数据库更新一次Map。可以有多个线程可以访问mapA。因此,如果我使用synchronized更新其中一个线程,那么在进行更新时线程可能会断开的任何实例。如果是这样如何解决这个问题??

Q2&GT; 我也有不同的班级成员。其中一些是常量,其中一些是从内存中加载的。但是他们都有一个共同的财产。它们对于所有实例(静态)始终相同。那么将所有内容放在一个类中还是应该有两个单独的类是否有意义?

由于

2 个答案:

答案 0 :(得分:3)

  

现在我需要每隔10分钟从数据库更新一次Map。可以有多个线程可以访问mapA。因此,如果我使用同步更新其中一个线程,那么在更新进行时线程可能会断开的任何实例。如果是这样如何解决这个问题??

这听起来似乎值得使用AtomicReference。从数据库中获取数据,将其放入映射中,然后使用“旧”映射进行原子交换。这样任何客户端代码都可以获取地图并知道它实际上是一个不会在它们下面发生变化的快照。

  

我也有不同的班级成员。其中一些是常量,其中一些是从memrory加载的。但是他们都有一个共同的财产。它们对于所有实例(静态)始终相同。因此,将所有内容放在一个类中或者我们是否应该有两个单独的类是有意义的。

这是一个非常含糊的描述。你指定的属性都没有(一些是常量,一些是从内存加载的,都有一个共同的属性,都是静态的)与它们是否应该在同一个类中有关。

答案 1 :(得分:0)

1. If synchronization is used on the group of statement or the method which is responsible改变MapA的关键状态,然后我认为不会有问题。

2. I am not getting a clear understanding of your 2nd question, but still you can divide them in to classes using cohesive principle.

内聚类是指具有反映其名称的方法的类。

例如:

 `class Animal with methods like Sound, Movements, etc...`