【发布时间】:2017-01-23 09:56:42
【问题描述】:
我有一个程序可以根据 cpu 的内核数自动生成线程(在我的情况下为 2,因为我在 VM 中运行该程序)
我有一个名为 createTable 的函数,如果它不存在,它会创建一个表,问题是我有多个线程,所以 IF 语句可能没用,我尝试使用同步但结果相同
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 级别进行。如果每个线程创建一个单独的对象,则不会有同步。
-
你是从两个不同的对象调用方法吗?如果是,在这种情况下,它将锁定两个不同的对象,因此将允许两个线程访问此方法代码。否则采取类级锁定。 (使方法静态)
-
该方法仅从一个对象@AndrewHenle 调用,但从不是我的代码调用,我使用的是 Apache Flink API
-
@A.Vadillo 你怎么知道它是对象的同一个实例?一个快速测试是改为在静态对象上进行同步。
标签: java multithreading parallel-processing