Java中的多锁对象

Java中的多锁对象,java,multithreading,locking,Java,Multithreading,Locking,这是我的密码 private String tableName1 = "Customers_Home"; private String tableName2 = "Customers_Work"; private String tableName3 = "Customers_Away"; public void insertData(List<Object> data1, List<Object> data2, List<Object> data3) {

这是我的密码

private String tableName1 = "Customers_Home";
private String tableName2 = "Customers_Work";
private String tableName3 = "Customers_Away";

public void insertData(List<Object> data1, List<Object> data2, List<Object> data3) {
   //inserts data into back-end database
   insertTable1Data(tableName1, data1);
   insertTable2Data(tableName2, data2);
   insertTable3Data(tableName3, data3);
   //there are more insertTableData() calls.
}

public List<List<Object>> getData() {

   //select data from back-end database
   List<Object> table1Data = getTable1Data(tableName1);
   List<Object> table2Data = getTable2Data(tableName2);
   List<Object> table3Data = getTable3Data(tableName3);

List<List<Object>> tableData = new ArrayList<>();
tableData.addAll(table1Data);
tableData.addAll(table2Data);
tableData.addAll(table3Data);
return tableData;
}
private String tableName1=“客户之家”;
私有字符串tablename 2=“客户\工作”;
私有字符串tableName3=“客户离开”;
公共void insertData(列表数据1、列表数据2、列表数据3){
//将数据插入后端数据库
插入Table1数据(tableName1,data1);
插入Table2数据(tableName2,data2);
插入Table3Data(tableName3,data3);
//还有更多的insertTableData()调用。
}
公共列表getData(){
//从后端数据库中选择数据
List table1Data=getTable1Data(tableName1);
List table2Data=getTable2Data(tableName2);
List table3Data=getTable3Data(tableName3);
List tableData=new ArrayList();
tableData.addAll(table1Data);
tableData.addAll(table2Data);
tableData.addAll(table3Data);
返回表格数据;
}
问题: getData()有时返回空列表或不完整的值,可能是因为在调用getData()之前insertData()尚未完成,这是一个线程问题,所以我使用了insertData()和getData()中的锁

public void insertData(列表数据1、列表数据2、列表数据3){
//将数据插入后端数据库
ReadWriteLock lock1=getLock(tableName1);//根据tableName(键)从HashMap返回ReadWriteLock。
布尔值=假;
做{
acquired=lock1.writeLock().tryLock(5,TimeUnit.ms);
}而(!获得);
插入Table1数据(tableName1,data1);
ReadWriteLock2=getLock(tableName2);
获得性=假;
做{
acquired=lock2.writeLock().tryLock(5,TimeUnit.ms);
}而(!获得);
插入Table2数据(tableName2,data2);
//对于tableName3,还有一个类似的do-while块。
插入Table3Data(tableName3,data3);
//尝试、捕捉、最终锁定和解锁操作。
}
这种方法是为每个insertTableData()操作创建一个锁对象,但我只想为每个insertData()操作使用一个锁对象,如何实现

有什么建议吗?
提前感谢。

将其设置为字段变量,以便在方法完成后再次引用,而不是每次调用该方法时都创建一个新的变量。为什么要尝试每5毫秒锁定一次?你能不能不运行
lock()
方法,它实际上会一直阻塞直到锁被持有?另外,你能详细说明你所说的每次创建一个新对象是什么意思吗?这些表是否单独访问过?您能不能在访问表的时间段内不共享一个锁?
public void insertData(List<Object> data1, List<Object> data2, List<Object> data3) {
       //inserts data into back-end database
ReadWriteLock lock1 = getLock(tableName1);//returns a ReadWriteLock from HashMap based on tableName (key).
     boolean acquired = false;
      do {
           acquired = lock1.writeLock().tryLock(5, TimeUnit.MILLISECONDS);
         } while (!acquired);
       insertTable1Data(tableName1, data1);

       ReadWriteLock lock2 = getLock(tableName2);
       acquired = false;
       do {
           acquired = lock2.writeLock().tryLock(5, TimeUnit.MILLISECONDS);
         } while (!acquired);
       insertTable2Data(tableName2, data2);
       //and a similar do while block for tableName3.
       insertTable3Data(tableName3, data3);
       //Ommitted try, catch, finally block and unlocking operation.
    }