面试时的两个技术问题 讨论一下。。

问题描述

1. 全局变量num=0 两个线程同时执行以下代码 { for(int i=0;i<50;i++){ num+=1; } } 最终num值的范围是什么?2. 设计一个并发量100左右的系统 从服务器 应用 手段各个角度考虑

解决方案

第一题应该是50到100并发100的话,考虑数据库连接池,缓存,并发安全上 使用锁,队列
解决方案二:
第一题:50-100第二题:上网搜 一大把
解决方案三:
第一题应该是100.无论线程什么时候阻塞,两个线程都会正常执行完,相当于执行两次+50第二题考虑连接池,重叠IO,端口重用等
解决方案四:
1. num+=1这个操作不具有原子性,并且mun至少被计算一次后泻入内存,因此从理论上讲,值的范围是1-1002. 这个要说的比较多,总的来说就是降低级别,少用锁,提高程序并发能力,话说回来100并发应该还可以,没那么多需要考虑的
解决方案五:
引用+ 和 =是两个操作吧 , 不会有这种情况: 线程1的+操作正在进行, 线程2的循环结束, 线程1才开始执行=操作吗。 还有int变量如果不加volatile关键字, 变量貌似是存放在各自的寄存器缓存里的, 而不一定什么时候才赋值给全局变量。。 有没有可能发生 线程2num赋值为50 而线程1重新把num变为1呢。。 或者线程2执行到49时, 线程1赋值给全局变量1 , 此时线程2拿到的num又变为1了?其实差不多就是这样子的。。。。所以答案应该是50~100
解决方案六:
用scala写的,都是用的java的类库,你改成java代码就可以了,结果50-100.object SzStudy extends App { import java.util.LinkedList import java.util.concurrent._ var num = 0 val pool = Executors.newFixedThreadPool(2) val calls = new LinkedList[Callable[Unit]](); val call = new Callable[Unit] { def call() { for (i <- 0 to 49) { num += 1 } } } calls.addLast(call) calls.addLast(call) val fa = pool.invokeAll(calls) val iter=fa.iterator //阻塞主线程,等两个子线程运行完 while(iter.hasNext){ iter.next.get() } println(num)}
解决方案七:
要看主子线程的阻塞程度了。 如zhangzehao 所写,两个子线处理速度足够快,那结构就是100如果子线程阻塞程度高,主线程没有阻塞那 也就是0或是1总所有情况取之范围应该会在0-100之间
解决方案八:
看了回答,同志们真心不看题啊,第一题问num最后的值是多少,不是让写程序。个人感觉是50~100,测实测第二题:并发量100该如何控控制,求教高手!这个真心不懂
解决方案:
public static void main(String[] args){Thread thread1 = new Thread(new Runnable() {@Overridepublic void run() {for(int i=0;i<50;i++){num++;System.out.println(num);}}});Thread thread2 = new Thread(new Runnable() {@Overridepublic void run() {for(int i=0;i<50;i++){num++;System.out.println(num);}}});thread1.start();thread2.start();}
解决方案:
上面那个有点问题,保证线程2先拿到;这里最后的结果就是1,,但是对于计算机来说num+=1; 这里执行的时间是一样多的,所以并不会出现线程1执行完了,线程2才执行了1步这种情况static int num =0;public static void c(){Thread t1 = new Thread(){@Overridepublic void run() {try {sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}for(int i=0;i<50;i++)num+=1;}}; Thread t2=new Thread(){@Overridepublic void run() {try { //线程2先拿到num,然后阻塞住sleep(999);for(int i=0;i<50;i++){int temp = num;if(i==0){sleep(1000);temp+=1;num=temp;}}} catch (InterruptedException e) {e.printStackTrace();}}};t1.start();t2.start();}public static void main(String[] args) {c();try {Thread.sleep(4000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(num);}
解决方案:
就算阻塞了它还是要循环的啊线程2这个时间很慢,按照你说的模拟了下static int num =0;public static void c(){Thread t1 = new Thread(){@Overridepublic void run() {try {sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}for(int i=0;i<50;i++)num+=1;}}; Thread t2=new Thread(){@Overridepublic void run() {try {sleep(1000);for(int i=0;i<50;i++){int temp = num;if(i==0){sleep(1000);temp+=1;num=temp;}}} catch (InterruptedException e) {e.printStackTrace();}}};t1.start();t2.start();}public static void main(String[] args) {c();try {Thread.sleep(4000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(num);}
解决方案:
tomcat 本身 默认支持的并发为200.配和连接池,完全给解决 第一个 50

时间: 2024-12-26 19:20:33

面试时的两个技术问题 讨论一下。。的相关文章

5G话语权的争夺,通信巨擘爱立信要靠这两大技术对抗华为?

在今年的MWC上,芯片商.通信设备商以及运营商这三股势力正式吹响了从4G到5G迈进的口号.而在5G商用之前,企业对核心技术的掌控能力将决定话语权的高低,这样的竞争对通信设备商而言显得尤其重要. 作为一家拥有140多年历史的老牌通信设备巨头,爱立信的地位在4G时代就遭遇到了华为.中兴这两家企业的冲击.但在5G的研发上,爱立信的表现并不逊色于任何一家企业.仅在今年短短的3个月内,爱立信就动作频频:先是携IBM共推硅基毫米波相控阵IC,后又联合韩国SK电讯完成全球首个洲际5G网络测试.....特别是相

数据结构 算查找算法-面试时遇到的算法问题,到现在也没解答出来

问题描述 面试时遇到的算法问题,到现在也没解答出来 如何从乱序的1001个整数中找出唯一的两个相同的数!求大神解答 解决方案 用hashset来计算,只要遍历一次就可以了: hashset的add方法返回值来判断原有整数是否存在,不存在会返回true,存在返回false. 存在代表着找到了重复的数字. 解决方案二: 从二进制的角度来考虑,1000个数字两两不同,同或运算,则为0,则剩下的那个数就是你要找的. 解决方案三: 可以用额外的存储空间么?可以的话就比较容易 解决方案四: 就是用for循环

Spark与Hadoop两大技术趋势解析

文章讲的是Spark与Hadoop两大技术趋势解析,开源数据集如今深受开发者喜爱,比如谷歌的Images dataset数据集,YouTube-8M数据集等.通过对数据集里的数据进行分析,可以发现许多隐藏信息,比如客户喜好.未知相关性,市场趋势以及其他有用的商业信息.大数据分析对企业降低成本,准确掌握市场趋势,更快完成产品迭代十分有用.说到大数据分析,16年基本被Spark与Hadoop霸屏,到底是什么样的魔力让它们足以引起大数据世界的波动,未来又会如何发展呢? Apache Spark Apa

如何在面试时选择合适的测试人员?

各位,大家好!今天分享一下我在面试测试人员时常问的一些问题及为什么,仅供各位参考,谢谢! 1.你最近3-5年的职业规划是什么? 重点考察测试人员的职业发展方向是否与当前职位招聘相符? 从其中可以侧面看出来其员工稳定性. 2.一个项目测试结束,有没什么经验总结?如果有,具体是如何开展的? 重点考察测试人员对自己能力提升方面,有没有提高总结的地方,从项目中吸取的经验与教训.从中可以看出来,测试人员是否属行自我驱动型人才! 3.为什么会选择做测试这份工作? 重点考察测试人员对待测试工作的态度及是否有发

论数据中心虚拟化两大技术代表:容器和虚拟机

如今,虚拟化技术在数据中心内已经生根发芽,应用非常普及,无论是在服务器.还是网络.存储等设备中都是如此.虚拟化技术起源于服务器,后来在网络设备中也出现,虽然都叫虚拟化技术,但是实现的原理是完全不同的,网络设备中的虚拟化也不能像服务器中的虚拟化可以虚拟化出数百或上千的虚拟设备,实现的技术也完全不同.本文着重讲述的是服务器中的虚拟化技术.服务器是数据中心最为重要的组成部分,所有的应用服务都要安装在服务器上,并运行,所以服务器上的虚拟化技术与应用最为密切相关.从早年的虚拟机技术到如今的容器技术,都是虚

光热和光伏两种技术并存发展有助能源市场稳定

2016年被许多业内人士看作是我国光热发展的启动元年,光热发电在热储能技术的支持下,通过将聚光集热与传统热电技术结合,实现了打破光照条件.日照时间等限制的目标,不仅可以作为基础电源.热源,还可以参与调峰.近日,记者就光热产业发展对意大利能源研究所(ENEA)两位专家Tommaso Crescenzi和Alberto Giaconia进行了采访. 国际合作是支柱因地制宜是关键 9月1日到2日,中国光热产业终于迎来了期待已久的标杆上网电价,这被誉为具有里程碑和划时代的意义.意大利能源研究所专家对此表

浅谈网站Site时出现两个首页现象

  笔者最近由于很忙,很少投稿什么文章了.之前貌似都是一周投稿一篇文章,现在也偷懒了,但是从现在开始,我会经常更新一些对新手朋友学习有所帮助的文章.废话不多说了,现在我们直入主题.浅谈下网站site时出现两个首页现象.可能很多朋友都遇到过或者看到过site一个网站时出现两个首页,现在笔者对其进行归类,大致可分为三类. 一.百度调整时发生的情况 今天笔者在无意中site下公司订单中的一个网站,发现一种奇怪的现象,那就是site竟然出现了两个首页.笔者在之前并未遇到过这种情况,百度了下虽然也有朋友遇

windows系统中,cleartype和平滑屏幕字体边缘,这两种技术的区别是啥?

问题描述 windows系统中,cleartype和平滑屏幕字体边缘,这两种技术的区别是啥? windows系统中,cleartype和平滑屏幕字体边缘,这两种技术的区别是啥? 解决方案 其实这个技术没什么特别的,无非就是通过在字体的边缘根据前景色背景色填充一些过渡的像素点,让文字的锯齿感不那么强. 解决方案二: cleartype是微软为这种技术申请的商品名 平滑屏幕字体边缘是这个技术的一个应用(cleartype还可以平滑打印输出的文字, )

string-为什么赋给值指针(动态指针)值时,两次输出不一样?并且输出的地址也不一样,怎么让它们一样

问题描述 为什么赋给值指针(动态指针)值时,两次输出不一样?并且输出的地址也不一样,怎么让它们一样 #include #include using namespace std;main(){ string str1; cout<<""输入一个数""; cin>>str1; char *Num1=new char[str1.length()]; int *num1=new int[str1.length()]; str1.copy(Num1st