• 欢迎来到达内Java培训官网

电话:400-996-5531

美国上市公司,专注Java培训22年

会Java并发面试小题在面试中不卡壳


Java并发面试小题在面试中不卡壳,对于技术人员在面试过程张免不了专业知识的笔试题,面如一些陌生端的专业名词你是否有点懵呢?

Java并发面试小题

Java 并发代码

publicclassExample1 {publicstaticint count = 0;publicstaticint clientTotal = 5000;publicstaticvoidmain(String[] args) throws Exception { ExecutorService executorService = Executors.newCachedThreadPool();for (int i = 0; i < clientTotal ; i++) { executorService.execute(() -> {try { add(); } catch (Exception e) {log.error("exception", e); } }); } }privatestaticvoidadd(){ count++; }}如果上面代码执行,count的值是多少?(为了说明重点问题,没有写最后打印的代码)5000?多次运行的结果,count的值是小于5000的。

解释一下上面的程序,首先定义了一个线程池,启动5000个线程执行add()操作,add函数处理静态成员变量count。

如果程序顺序调用,count的值应该是5000。

for(int i=0;i<5000;i++){add();}复制代码但是线程池启动多线程,是并发执行的。每个线程启动之后,不管是否运行结束,下一个线程会马上启动。

启动线程的过程,是一个异步过程,启动线程立即返回,启动下一个进程。

当多个线程对同一个变量add进行操作的时候,就会发生写写冲突。

线程1、线程2 同时对值为0的变量进行操作,结果返回1,而不是2。如果这个地方想不明白,就请留言,或者看看文章顶部那些原理图。

要不简单点,记住“多线程对全局变量的写操作会发生冲突”。

答案,声明原子变量 AtomicInteger count

publicclassCountExample2 {// 请求总数publicstaticint clientTotal = 5000;// 同时并发执行的线程数publicstaticint threadTotal = 200;publicstatic AtomicInteger count = ew AtomicInteger(0);publicstaticvoidmain(String[] args) throws Exception { ExecutorService executorService = Executors.newCachedThreadPool(); final Semaphore semaphore = new Semaphore(threadTotal); final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);for (int i = 0; i < clientTotal ; i++) { executorService.execute(() -> {try { semaphore.acquire();add(); semaphore.release(); } catch (Exception e) { log.error("exception", e); } countDownLatch.countDown(); }); } countDownLatch.await(); executorService.shutdown(); #("count:{}", count.get()); }privatestaticvoidadd() { count.incrementAndGet();// count.getAndIncrement(); }}注,上面的代码用了生成者消费者模式,5000个生产者,200个消费者,对程序并发做一定限制,防止5000个线程卡死计算机。

内存模型,也说点简单的

栈(heap),函数加载的时候,为函数内部变量分配的空间。和父函数的内部变量和运行指针共享同一块区域。

函数运行时,new的空间,都是放在堆中的。

这个就是C的内存模型,做shellcode的基础知识。

来源:纯洁的微笑

感谢大家阅读由Java职场分享的“会Java并发面试小题在面试中不卡壳”希望对大家有所帮助,想了解更多培训信息请关注Java培训机构官网

免责声明:以上内容仅作为信息传播,文中部分信息来源于互联网,仅供阅读参考。


【免责声明】本文部分系转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,如涉及作品内容、版权和其它问题,请在30日内与我们联系,我们会予以重改或删除相关文章,以保证您的权益!

Java开发高端课程免费试学

大咖讲师+项目实战全面提升你的职场竞争力

  • 海量实战教程
  • 1V1答疑解惑
  • 行业动态分析
  • 大神学习路径图

相关推荐

更多
  • 中级Java发开工程师需要那些技术和工程师证
    中级Java发开工程师需要那些技术和工程师证
    中级Java发开工程师需要那些技术和工程师证?中级Java开发工程师通常需要具备以下技术和技能: 详情>>

    2024-04-02

  • Java高级工程师岗位要求
    Java高级工程师岗位要求
    Java高级工程师岗位要求,Java高级工程师是企业中非常关键的技术岗位,主要负责软件的设计、开发、测试和维护工作。具体岗位要求可能因企业的规模、行业、产品和技术栈的不同而有所差异,但通常包括以下几个方面: 详情>>

    2024-03-05

  • 面试Java开发工程师一般问什么问题?
    面试Java开发工程师一般问什么问题?
    面试Java开发工程师一般问什么问题?面试Java开发工程师时,面试官通常会从多个角度评估应聘者的技能和经验,包括基础知识、编程能力、项目经验、问题解决能力、沟通能力以及对Java技术的理解。以下是一些常见的面试问题: 详情>>

    2024-02-29

  • 如何用Java开发游戏?
    如何用Java开发游戏?
    如何用Java开发游戏?使用Java开发游戏可以分为几个步骤,下面是一些基础的指导: 详情>>

    2024-02-29

  • Java开班时间

    收起