我知道互聯網上已經有很多類似的問題,但我的問題是關於我的代碼,而不是關於線程。我正在製作一個擁有玩家數據庫的小應用程序。數據存儲類的代碼如下。從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