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堆中内存
当然不是啦。要加锁或互斥的