簡體   English   中英

2個線程同時訪問同步函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM