gpt4 book ai didi

java - 我应该在 Java EE 应用程序中的什么位置(确切地)使用同步

转载 作者:行者123 更新时间:2023-12-02 07:18:46 24 4
gpt4 key购买 nike

我正在使用 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 方法,或者在处理用户投票并根据游戏 ID 决定应更新哪个对象的 Controller Servlet 中?

<小时/>

如果我决定在类内使用同步,我可以使用 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++;
}
}

}

我说得对吗?

最佳答案

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

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

关于java - 我应该在 Java EE 应用程序中的什么位置(确切地)使用同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14547452/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com