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;   
     }
}

Web サイトの訪問者は、ゲームについて賛成票または反対票を投じるオプションがあり、結果は ajax などを使用してサーバーに送信されます。

質問は次のとおりです。

GameRank オブジェクトの属性へのアクセスをどこで同期する必要がありますか? それらのゲッター メソッドとセッター メソッド、またはユーザーの投票を処理し、ゲーム ID に基づいてどのオブジェクトを更新する必要があるかを決定するコントローラー サーブレット内?

10倍前払い


クラス内で同期を使用することにした場合は、AtomicInteger を提案されたポスターの 1 つとして使用するか、次のように使用できます。

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 (または一般的にサーブレットを使用する場合) では、さまざまな要求がさまざまなスレッドによって処理されます。これらのスレッドが共有オブジェクトで動作する場合は常に、何らかの同期が必要になります。

永続化テクノロジに応じて、そうである場合とそうでない場合があります。JPA では、各スレッドに独自の永続コンテキストを与え、データベース内の競合する更新を検出するのが一般的です。その場合、JVM 内での同期は必要ありませんが、更新の競合が原因でトランザクションをコミットできない場合に備えて、再試行ロジックを実装する必要がある場合があります。スレッド間で JDBC オブジェクト ( Connection、 ) を共有しない限り、JDBC を使用する場合も同じことが当てはまります。Resultset

于 2013-01-27T13:11:02.900 に答える
0

スレッドセーフであることの責任を外部化することの問題は、他のクライアントがそのような懸念を自由に無視して、すべての使用法を破壊することです。

そのような懸念を内面化し、クラスをスレッドセーフにすることをお勧めします。

幸いなことに、JDK には、これらすべてを実行するクラス AtomicInteger が用意されています。カウンターのタイプを AtomicInteger に変更すると、スレッドセーフな方法でカウンターをインクリメントするメソッドを追加するだけで済みます。詳細については、AtomicInteger の javadoc を参照してください。

于 2013-01-27T13:23:06.447 に答える
-1

GameRankに同期メソッドを導入すると、そのメソッドは投票(+ veまたは-ve)を受け入れ、それに応じてpositiveVotes/negativeVotesを更新します。

于 2013-01-27T13:04:34.893 に答える