我知道互联网上已经有很多类似的问题,但我的问题是关于我的代码,而不是关于线程。我正在制作一个拥有玩家数据库的小应用程序。数据存储类的代码如下。从java中的两个线程同时访问变量
public class DataManager
{
static final int NO_OF_COLUMNS = 18;
static QDatabase pdb;
public DataManager()
{
pdb = new QDatabase(NO_OF_COLUMNS);
}
public void addPlayer(Object[] playerData)
{
pdb.add(playerData);
}
public void editPlayerInfo(int type, int playerRegNo, Object data)
{
pdb.set(type, playerRegNo, data);
}
public int getPlayerRegNo(String userID)
{
return (int) pdb.getData(USER_ID, userID, REG_NO);
}
public Boolean contains(int column, Object data)
{
return pdb.contains(column, data);
}
}
我有不断recieving来自多个客户端的请求,并创造了他们每个人的一个新线程的服务器。他们都访问这个基本上充当数据库的DataManager类。在某种程度上,我是否有可能让所有线程同时调用方法addPlayer()
和editPlayerInfo()
,但由于同步问题而不能混淆整个事件?
我也知道我可以使用数据库。但在这里,我只是认为这会更容易。假设将有大约200个线程同时运行。我解决这个问题的最好方法是什么?
有没有什么办法让我所有的线程在同一时间访问它,否则有200个线程相互等待可能会变得非常慢?
编辑1: 的QDatabase类如下:
public class QDatabase implements Serializable
{
private ArrayList<ArrayList<Object>> database;
public final int NOT_EXISTS = 0, REGULAR = 0, TRANSPOSE = 1;
private int lastid = -1;
//Initializer taking the number of columns as an argument
public QDatabase(int noofcolumns)
{
database = new ArrayList<ArrayList<Object>>();
addColumns(noofcolumns);
}
//Method that adds an array of objects as a new row in the database.
public void add(Object[] object)
{
for(int index = 0; index < database.size(); index++)
{
if(object != null)
{
database.get(index).add(object[index]);
lastid = database.get(0).indexOf(object[0]);
}
}
}
//Method that finds the row in a column where an instance of a particular object is found and get the values at a
//cell with the same row and a given column.
public Object getData(int columntocheck, Object check, int columntoget)
{
Object ramobject = null;
int loc = database.get(columntocheck).indexOf(check);
ramobject = database.get(columntoget).get(loc);
return ramobject;
}
//Method to check if a column contains an instance of a given object.
public Boolean contains(int column, Object objecttocheck)
{
return database.get(column).contains(objecttocheck);
}
//Method to set a given cell to an object.
public void set(int column, int row, Object object)
{
database.get(column).set(row, object);
}
}
我需要多个线程来访问相同的数据库。它是一台服务器。那么,我需要做什么? – Hele 2013-04-28 04:05:34
保持原样。这个类可以并发使用。 – 2013-04-28 04:08:50
你能解释一下这个类对于并发使用是否可行?如果两个或多个线程同时调用editPlayerInfo会发生什么情况? – Hele 2013-04-28 04:13:30