System,2024年百度Java面试真题,吊打面试官

本文探讨了Java中的System.arraycopy在多线程环境下的安全性,以及浅拷贝和深拷贝的区别。通过代码示例和实验,作者验证了System.arraycopy在并发情况下的不安全性,并介绍了如何使用ReentrantLock确保线程同步。
摘要由CSDN通过智能技术生成

System.out.println(“改变后”);

print("src = ", src);

print("dest = ", dest);

}

//二维数组toString()

private static void print(String string, int[][] arr) {

System.out.print(string);

for (int[] a : arr) {

for (int i : a) {

System.out.print(i + " ");

}

System.out.print(“,”);

}

System.out.println();

}

二维数组属于浅拷贝,原始数组改变后,复制的数据也发生了改变!

3、对象复制(深拷贝?)

四、System.arraycopy是不安全的


1、代码实例

多线程对数组进行复制,看System.arraycopy线程是否安全?

package com.guor.test.javaSE.collection;

import java.util.Arrays;

import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.ReentrantLock;

public class ArrayTest2 {

private static int[] arrayOriginal = new int[1024 * 1024 * 10];

private static int[] arraySrc = new int[1024 * 1024 * 10];

private static int[] arrayDest = new int[1024 * 1024 * 10];

private static ReentrantLock lock = new ReentrantLock();

private static void modify() {

for (int i = 0; i < arraySrc.length; i++) {

arraySrc[i] = i + 1;

}

}

private static void copy() {

System.arraycopy(arraySrc, 0, arrayDest, 0, arraySrc.length);

}

private static void init() {

for (int i = 0; i < arraySrc.length; i++) {

arrayOriginal[i] = i;

arraySrc[i] = i;

arrayDest[i] = 0;

}

}

private static void doThreadSafeCheck() throws Exception {

for (int i = 0; i < 100; i++) {

System.out.println("run count: " + (i + 1));

init();

Condition condition = lock.newCondition();

new Thread(new Runnable() {

@Override

public void run() {

lock.lock();

condition.signalAll();

lock.unlock();

copy();

}

}).start();

lock.lock();

// 这里使用 Condition 来保证拷贝线程先已经运行了.

condition.await();

lock.unlock();

Thread.sleep(2); // 休眠2毫秒, 确保拷贝操作已经执行了, 才执行修改操作.

modify();

// 如果 System.arraycopy 是线程安全的, 那么先执行拷贝操作, 再执行修改操作时, 不会影响复制结果, 因此 arrayOriginal 必然等于 arrayDist;

if (!Arrays.equals(arrayOriginal, arrayDest)) {

throw new RuntimeException(“System.arraycopy is not thread safe”);

}

}

}

public static void main(String[] args) throws Exception {

//doThreadSafeCheck();

executeTime();

}

private static void executeTime() {

String[] srcArray = new String[1000000];

String[] forArray = new String[srcArray.length];

String[] arrayCopyArray = new String[srcArray.length];

//初始化数组

for(int i = 0 ; i < srcArray.length ; i ++){

srcArray[i] = String.valueOf(i);

}

long forStartTime = System.currentTimeMillis();

for(int index = 0 ; index < srcArray.length ; index ++){

forArray[index] = srcArray[index];

}

long forEndTime = System.currentTimeMillis();

System.out.println(“for方式复制数组:” + (forEndTime - forStartTime));

long arrayCopyStartTime = System.currentTimeMillis();

System.arraycopy(srcArray,0,arrayCopyArray,0,srcArray.length);

long arrayCopyEndTime = System.currentTimeMillis();

System.out.println(“System.arraycopy复制数组:” + (arrayCopyEndTime - arrayCopyStartTime));

}

}

2、代码思路分析

  1. arrayOriginal 和 arraySrc 初始化时是相同的, 而 arrayDist 是全为零的.

  2. 启动一个线程运行 copy() 方法来拷贝 arraySrc 到 arrayDist 中.

  3. 在主线程执行 modify() 操作, 修改 arraySrc 的内容. 为了确保 copy() 操作先于 modify() 操作, 我使用 Condition, 并且延时了两毫秒, 以此来保证执行拷贝操作(即System.arraycopy) 先于修改操作.

  4. 根据第三点, 如果 System.arraycopy 是线程安全的, 那么先执行拷贝操作, 再执行修改操作时, 不会影响复制结果, 因此 arrayOriginal 必然等于 arrayDist; 而如果 System.arraycopy 是线程不安全的, 那么 arrayOriginal 不等于 arrayDist.

3、控制台输出

往期精彩内容:

Java知识体系总结(2021版)

超详细的springBoot学习笔记

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

总结

一般像这样的大企业都有好几轮面试,所以自己一定要花点时间去收集整理一下公司的背景,公司的企业文化,俗话说「知己知彼百战不殆」,不要盲目的去面试,还有很多人关心怎么去跟HR谈薪资。

这边给大家一个建议,如果你的理想薪资是30K,你完全可以跟HR谈33~35K,而不是一下子就把自己的底牌暴露了出来,不过肯定不能说的这么直接,比如原来你的公司是25K,你可以跟HR讲原来的薪资是多少,你们这边能给到我的是多少?你说我这边希望可以有一个20%涨薪。

最后再说几句关于招聘平台的,总之,简历投递给公司之前,请确认下这家公司到底咋样,先去百度了解下,别被坑了,每个平台都有一些居心不良的广告党等着你上钩,千万别上当!!!

Java架构学习资料,学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

望可以有一个20%涨薪。

最后再说几句关于招聘平台的,总之,简历投递给公司之前,请确认下这家公司到底咋样,先去百度了解下,别被坑了,每个平台都有一些居心不良的广告党等着你上钩,千万别上当!!!

Java架构学习资料,学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书。
[外链图片转存中…(img-ND8HJUzI-1710742725587)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 27
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值