Java并发面试,幸好有点道行,不然又被忽悠了
前言
面试Java,必然要被问Java内存模型和Java并发开发。我被问到的时候,心里慌得一批,“额,是在《Thinking in Java》里面写的吗?果然每天增删改太low了”
要理解这些图吗?
我希望能解释的再简单少量,以上都不使用
Java 并发代码
假如上面代码执行,count的值是多少?(为了说明重点问题,没有写最后打印的代码)5000?屡次运行的结果,count的值是小于5000的。
解释一下上面的程序,首先定义了一个线程池,启动5000个线程执行add()操作,add函数解决静态成员变量count。
假如程序顺序调使用,count的值应该是5000。
for(inti=0;i<5000;i++){
add();
}
复制代码但是线程池启动多线程,是并发执行的。每个线程启动之后,不论能否运行结束,下一个线程会马上启动。
启动线程的过程,是一个异步过程,启动线程立即返回,启动下一个进程。
当多个线程对同一个变量add进行操作的时候,就会发生写写冲突。
线程1、线程2 同时对值为0的变量进行操作,结果返回1,而不是2。假如这个地方想不明白,就请留言,或者者看看文章顶部那些原理图。
要不简单点,记住“多线程对全局变量的写操作会发生冲突”。
答案,公告原子变量 AtomicInteger count
注,上面的代码使用了生成者消费者模式,5000个生产者,200个消费者,对程序并发做肯定限制,防止5000个线程卡死计算机。
内存模型,也说点简单的
栈(heap),函数加载的时候,为函数内部变量分配的空间。和父函数的内部变量和运行指针共享同一块区域。
函数运行时,new的空间,都是放在堆中的。
这个就是C的内存模型,做shellcode的基础知识。
欢迎工作一到五年的Java工程师朋友们加入Java架构开发:744677563
本群提供免费的学习指导 架构资料 以及免费的解答
不懂得问题都可以在本群提出来 之后还会有职业生涯规划以及面试指导
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Java并发面试,幸好有点道行,不然又被忽悠了