run count: 1
run count: 2
Exception in thread "main" java.lang.RuntimeException: System.arraycopy is not thread safe
at com.test.ArrayCopyThreadSafe.doThreadSafeCheck(ArrayCopyThreadSafe.java:62)
at com.test.ArrayCopyThreadSafe.main(ArrayCopyThreadSafe.java:68)
System.arraycopy
是一个native
方法:而
native
方法和线程安全之间又没有什么必然联系, 并且我看System.arraycopy
的文档中也没有提到它是线程安全的, 因此就可以知道它是线程不安全的
.不過為了驗證
System.arraycopy
是否真的是線程不安全的, 我寫了一個小例子:這個範例的具體操作是:
arrayOriginal 和 arraySrc 初始化時是相同的, 而 arrayDist 是全為零的.
啟動一個執行緒運行
copy()
方法來拷貝 arraySrc 到 arrayDist 中.在主線程執行
modify()
操作, 修改arraySrc 的內容. 為了確保modify()
操作, 修改 arraySrc 的内容. 为了确保copy()
操作先于modify()
操作先於modify()
操作, 我使用Condition, 並且延時了兩毫秒, 以此來保證執行拷貝操作(即System.arraycopy) 先於修改操作.根據第三點, 如果
是System.arraycopy
是线程安全的, 那么先执行拷贝操作, 再执行修改操作时, 不会影响复制结果, 因此 arrayOriginal 必然等于 arrayDist; 而如果System.arraycopy
是线程不安全的
是線程安全的, 那麼先執行拷貝操作, 再執行修改操作時, 不會影響複製結果, 因此arrayOriginal 必然等於arrayDist; 而如果線程不安全的, 那麼arrayOriginal 不等於arrayDist.
native方法 直接copy堆中記憶體
當然不是啦。要加鎖或互斥的