我只有一個同步方法。其目的是防止兩個線程更新同一個表,這肯定會導致異常。我試圖更新一個數據來自一個巨大的外部數據庫的表。在更新我的表格之前,我必須做一些過濾和清理,這需要花費很多時間。我創建了多個線程,以便我可以分割任務並快速更新表格。只要一個線程完成清理數據,它應該更新我的表,而其他線程仍在清理工作。但是,在我的示例代碼中,線程會覆蓋值,因爲發生關係之前發生。我不希望線程共享我希望他們在更新某個線程時不更新的數據。如果你可以在我的代碼中看到,我創建了一個列表,我用它來循環創建一個線程並從列表中傳遞每個數據。但是,在結果中,線程1,4和5在Synchronized方法中使用相同的programId時,它們不應該是。任何人都可以幫助防止這種情況,以便每個線程將在同步代碼中具有唯一的ID嗎?如何防止在java中的同步代碼發生之前?
這裏是我的代碼:
public Class HomeController{
List<String> programList = new ArrayList<String>();
programList.add("xxx");
programList.add("yyy");
for(String programId: programList){
System.out.println("programId Controller is " + programId);
//for each program Id create a thread
runnable.setProgramId(programId);
taskExecutor.execute(runnable);
}
}
public class TestRunnable implements Runnable{
public void run(){
String threadName = Thread.currentThread().getName();
System.out.println("threadName and programId Runnable are " + threadName +"--"+ programId);
TestSynchronized testSynchronized = new TestSynchronized();
testSynchronized.updateTable(programId);
}
}
}
public class TestSynchronized{
private volatile boolean isLocked = false;
public synchronized void updateTable(String programId){
while(isLocked) {
try {
wait();
} catch (InterruptedException e) {}
}
isLocked=true;
String threadName = Thread.currentThread().getName();
System.out.println("threadName and programId Synchronized are " + threadName +"--"+ programId);
isLocked=false;
notify();
}
}
下面是結果:
programId Controller is 23022490857
programId Controller is 23022491963
threadName and programId Runnable are taskExecutor-1--23022490857
programId Controller is 23022492068
threadName and programId Runnable are taskExecutor-2--23022491963
programId Controller is 23022492300
threadName and programId Synchronized are taskExecutor-1--23022491963
programId Controller is 23022495561
threadName and programId Runnable are taskExecutor-3--23022492068
threadName and programId Synchronized are taskExecutor-2--23022492068
programId Controller is 38416827134
threadName and programId Synchronized are taskExecutor-3--23022492300
threadName and programId Runnable are taskExecutor-4--23022492300
threadName and programId Runnable are taskExecutor-1--38416827134
threadName and programId Synchronized are taskExecutor-1--38416827134
threadName and programId Runnable are taskExecutor-5--23022495561
threadName and programId Synchronized are taskExecutor-4--38416827134
threadName and programId Synchronized are taskExecutor-5--38416827134
您應該爲每個programId創建一個同步測試,以及一個TestRunnable。您不應該重複使用相同的TestRunnable。 –
感謝馬克的快速回復。我怎樣才能防止兩個線程同時更新同一個表,因爲它會導致異常? –
請詢問您的實際問題,因爲該問題與您展示的代碼的問題並無關係。 –