0

我正在使用 Java EE 为游戏评论开发一个内容管理系统。

我有一个非常简单的问题,这里是:

我有一个带有 Game 对象的 ArrayList。每个游戏对象都有 GameRank 属性,它是一个简单的类,定义如下:

public class GameRank 
{
    private int activity;
    private int positiveVotes;
    private int negativeVotes;


     public GameRank(int activity, int positiveVotes, int negativeVotes) 
     {
       this.activity = activity;
       this.positiveVotes = positiveVotes;
       this.negativeVotes = negativeVotes;   
     }
}

网站的访问者可以选择对游戏投赞成票或反对票,结果将使用 ajax 发送到服务器。

所以问题是:

我应该在哪里同步对 GameRank 对象属性的访问——它们的 getter 和 setter 方法,或者在处理用户投票的 Controller Servlet 中,并根据游戏 ID 决定应该更新哪个对象?

提前 10 倍


如果我决定在课堂上使用同步,我可以使用 AtomicInteger 作为建议的海报之一或这个:

public class GameRank 
{
private volatile int activity;
private volatile int positiveVotes;
private volatile int negativeVotes;


public GameRank(int activity, int positiveVotes, int negativeVotes) 
{
    this.activity = activity;
    this.positiveVotes = positiveVotes;
    this.negativeVotes = negativeVotes;

    this.checkAndFixValues();
}

private void checkAndFixValues()
{
    if(this.activity < 1) this.activity = 1;
    if(this.positiveVotes < 1) this.positiveVotes = 1;
    if(this.negativeVotes < 1) this.negativeVotes = 1;
}

public int getActivity() 
{
    synchronized(GameRank.class)
    {
        return activity;
    }
}

public int getPositiveVotes() 
{
    synchronized(GameRank.class)
    {
        return positiveVotes;
    }
}

public int getNegativeVotes() 
{
    synchronized(GameRank.class)
    {
        return negativeVotes;
    }
}

public void incrementActivitiy()
{
    synchronized(GameRank.class)
    {
        activity++;
    }
}

}

我对吗?

4

3 回答 3

3

在 Java-EE(或者通常在使用 servlet 时)中,不同的请求由不同的线程处理。无论这些线程在哪里操作共享对象,您都需要某种同步。

根据您的持久性技术,情况可能会也可能不会。使用 JPA,通常为每个线程提供自己的持久性上下文,并检测数据库中的冲突更新。如果这样做,则不需要在 JVM 中进行同步,但您可能需要实现重试逻辑,以防事务由于更新冲突而无法提交。使用 JDBC 时也是如此,前提是您不跨线程共享 JDBC 对象 ( Connection, )。Resultset

于 2013-01-27T13:11:02.900 回答
0

将线程安全的责任外部化的问题是其他客户端可以随意忽略这些问题,从而破坏所有使用。

最好将这些问题内化,并使您的类线程安全。

幸运的是,JDK 提供了一个可以为您完成所有工作的类:AtomicInteger。如果将计数器的类型更改为 AtomicInteger,则可以简单地添加方法以线程安全的方式递增它们。有关更多信息,请参阅 AtomicInteger 的 javadoc。

于 2013-01-27T13:23:06.447 回答
-1

您可以在 GameRank 中引入同步方法,该方法将接受投票(+ve or-ve)并相应地更新 positiveVotes/negativeVotes。

于 2013-01-27T13:04:34.893 回答