![](/img/trans.png)
[英]Java: Multiple threads decrementing static variable via synchronized method accessing variable at the same time
[英]2 threads accessing at the same time to a synchronized function
我有一個程序,根據cpu的核心數自動生成線程(在我的情況下為2,因為我在VM中運行程序)
我有一個名為createTable的函數,如果它不存在則創建一個表,問題是我有多個線程所以IF語句可能是unusefull,我試圖使用synchronized但我有相同的結果
public synchronized void createTable(Utils utils, String tableName, RowSerializable row) {
if(!utils.getClient().tableExists(tableName)) {
this.table = utils.generateTable(tableName, row);
this.fieldsNames = utils.getNamesOfColumns(table);
}
}
任何的想法?
您可能使用多個實例,否則您在實例上同步的方法訪問時不會出現同步問題。
要解決您的問題,您可以在所有實例共享的靜態字段上進行同步。
在類中添加一個靜態Object
並進行同步,它應該解決並發訪問的問題:
public class YourClassThatHasTheProblem {
...
private static final Object lock = new Object();
...
public void createTable(Utils utils, String tableName, RowSerializable row) {
synchronized (lock) {
if(!utils.getClient().tableExists(tableName)) {
this.table = utils.generateTable(tableName, row);
this.fieldsNames = utils.getNamesOfColumns(table);
}
}
}
...
}
如果它不能解決您的問題,則意味着該問題不僅來自代碼同步,而是因為您在另一個類或方法中執行類似的處理,並且未與此調用同步。 因此它使用createTable()
調用創建了副作用。
2個線程可能正在訪問createTable
方法,我將嘗試解釋。
此方法定義為synchronized
,這意味着它同步的對象就是this
。 所以我的猜測是,在你的程序中,2個線程可以訪問createTable
因為有兩個不同的對象,每個createTable
同步。
因此,如果2個線程想要創建具有相同名稱的新表 - 這是可能的。
注意:此分析基於您提供的信息,如果您認為不太可能,請提供更多信息,我會盡力提供幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.