java中System.arraycopy是线程安全的吗?
请问一下 在java中System.arraycopy是不是线程安全的
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
请问一下 在java中System.arraycopy是不是线程安全的
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
System.arraycopy
是一个native
方法:而
native
方法和线程安全之间又没有什么必然联系, 并且我看System.arraycopy
的文档中也没有提到它是线程安全的, 因此就可以知道它是线程不安全的
.不过为了验证
System.arraycopy
是否真的是线程不安全的, 我写了一个小例子:这个例子的具体操作是:
arrayOriginal 和 arraySrc 初始化时是相同的, 而 arrayDist 是全为零的.
启动一个线程运行
copy()
方法来拷贝 arraySrc 到 arrayDist 中.在主线程执行
modify()
操作, 修改 arraySrc 的内容. 为了确保copy()
操作先于modify()
操作, 我使用 Condition, 并且延时了两毫秒, 以此来保证执行拷贝操作(即System.arraycopy) 先于修改操作.根据第三点, 如果
System.arraycopy
是线程安全的, 那么先执行拷贝操作, 再执行修改操作时, 不会影响复制结果, 因此 arrayOriginal 必然等于 arrayDist; 而如果System.arraycopy
是线程不安全的
, 那么 arrayOriginal 不等于 arrayDist.根据上面的推理, 运行一下程序, 有如下输出:
可以看到, 前两次运行的好好的, 但是第三次就不行了.
native方法 直接copy堆中内存
当然不是啦。要加锁或互斥的