ArrayList 的執行緒安全問題

元亨利貞發表於2024-01-05

錯誤資訊:

java.util.ConcurrentModificationException: null
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909) ~[?:1.8.0_181]
    at java.util.ArrayList$Itr.next(ArrayList.java:859) ~[?:1.8.0_181]
    at com.vsoc.realtime.schedule.functions.PostgreSQLSinkFunction.flush(PostgreSQLSinkFunction.java:199) ~[blob_p-87058e81471573bdb6638bc203aad50c09ce387c-f9f70b611eeba0339b2421e8d3b249d4:?]
    at com.vsoc.realtime.schedule.functions.PostgreSQLSinkFunction.lambda$open$0(PostgreSQLSinkFunction.java:88) ~[blob_p-87058e81471573bdb6638bc203aad50c09ce387c-f9f70b611eeba0339b2421e8d3b249d4:?]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_181]
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [?:1.8.0_181]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_181]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [?:1.8.0_181]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_181]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_181]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]

錯誤原因:
在SinkFunction函式裡面,使用List不當的話,可能會導致執行緒安全問題,比如,配置了一個定時任務,定時遍歷獲取資料,但是另外一個地方在往這個List裡面寫資料,這種情況,就可能會導致執行緒安全問題。

解決方案

//Collections.synchronizedList 
buffer = Collections.synchronizedList(new ArrayList<>());
private void flush() {
    // synchronized
    synchronized (buffer) {
    //
    ......
    }
    }


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70024433/viewspace-3002760/,如需轉載,請註明出處,否則將追究法律責任。

相關文章