2个线程同时访问同步函数

时间:2017-01-23 09:56:42

标签: java multithreading parallel-processing

我有一个程序可以自动生成线程,具体取决于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);
   }
}

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您可能使用多个实例,否则您在实例上同步的方法访问时不会出现同步问题。

要解决您的问题,您可以在所有实例共享的静态字段上进行同步。

在类中添加静态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()调用时产生副作用。

答案 1 :(得分:1)

2个线程可能正在访问createTable方法,我将尝试解释。

此方法定义synchronized,这意味着它同步的对象是this。 所以我的猜测是,在你的程序中,2个线程可以访问createTable,因为有两个不同的对象,每个createTable同步。

因此,如果2个线程想要创建具有相同名称的新表,则可能。

注意:此分析基于您提供的信息,如果您认为不太可能,请提供更多信息,我会尽力提供帮助。