Java并发面试,幸亏有点道行,不然又被忽悠了 1
前言
面试Java,必然要被问Java内存模型和Java并发开发。我被问到的时候,心里慌得一批,“额,是在《Thinking in Java》里面写的吗?果然每天增删改太low了”
要了解这些图吗?
我希望能解释的再简单一些,以上都不用
Java 并发代码
public class Example1 {public static int count = 0;public static int clientTotal = 5000;public static void main(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);}});}}private static void add() {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
public class CountExample2 {// 请求总数public static int clientTotal = 5000;// 同时并发执行的线程数public static int threadTotal = 200;public static AtomicInteger count = new AtomicInteger(0);public static void main(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();log.info("count:{}", count.get());}private static void add() {count.incrementAndGet();// count.getAndIncrement();}
}
注,上面的代码用了生成者消费者模式,5000个生产者,200个消费者,对程序并发做一定限制,防止5000个线程卡死计算机。
内存模型,也说点简单的
- 栈(heap),函数加载的时候,为函数内部变量分配的空间。和父函数的内部变量和运行指针共享同一块区域。
- 函数运行时,new的空间,都是放在堆中的。
这个就是C的内存模型,做shellcode的基础知识。
作者:白头雁
链接:https://www.jianshu.com/p/8cb...
终于,我还是码造一个了中国地图
SVG前戏—让你的View多姿多彩
分享几个Android很强势的的开源框架
(Android)面试题级答案(精选版)
Java并发面试,幸亏有点道行,不然又被忽悠了 1相关推荐
- 多线程面试题_100多线程和Java并发面试问答–最终清单(PDF下载)
多线程面试题 在这篇文章中,我们将提供有关多线程和Java并发面试问答的综合文章. 编者注:并发始终是开发人员的挑战,编写并发程序可能非常困难. 引入并发时,有很多事情可能会崩溃,并且系统的复杂性会大 ...
- 并发执行变成串行_大白话Java并发面试问题之Java 8如何优化CAS性能?
专注于Java领域优质技术,欢迎关注 来自:石杉的架构笔记 一.前言 这篇文章给大家聊一下java并发包下的CAS相关的原子操作,以及Java 8如何改进和优化CAS操作的性能. 因为Atomic系列 ...
- Java并发面试,幸亏有点道行,不然又被忽悠了
2019独角兽企业重金招聘Python工程师标准>>> 前言 面试Java,必然要被问Java内存模型和Java并发开发.我被问到的时候,心里慌得一批,"额,是在<T ...
- java 并发 面试_Java 并发基础常见面试题总结
1. 什么是线程和进程? 1.1. 何为进程? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的.系统运行一个程序即是一个进程从创建,运行到消亡的过程. 在 Java 中,当我们启 ...
- Java 并发面试题解
作为一名专业的 Java 开发者,如何在并发场景中写出优良的代码,是一道绕不开的坎,也是考量一个 Java 开发者功底的关键技术.因此,不难发现 Java 并发问题一直是各个大厂面试的重点之一,然而我 ...
- 【搞定 Java 并发面试】面试最常问的 Java 并发进阶常见面试题总结!
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习 面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.觉得内容不错 ...
- Java并发面试宝典,并发相关面试再也难不倒你!
1.在java中守护线程和用户线程的区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon ...
- 大白话系列之java_并发系列2-大白话聊聊Java并发面试问题之Java 8如何优化CAS性能?【石杉的架构笔记】...
Lua-面向对象中函数使用时冒号(:)和点(.)的区别 先来看一段简单的代码: local Animal = {} function Animal:Eat( food ) print("An ...
- 面试问到java并发_那些面试官必问的JAVA多线程和并发面试题及回答
Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环 ...
- java多线程面试_Java多线程和并发基础面试问答,看过后你不会后悔
***:Java多线程面试问题 1:进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java ...
最新文章
- 腾讯提结合ACNet进行细粒度分类,效果达到最新SOTA | CVPR 2020
- 【Java】eclipse如何导入项目
- 使用R画桑基图(流程图)
- Lambda架构与推荐在电商网站实践
- 萝卜家园win11系统32位微软原版镜像v2021.08
- QueryPerformanceFrequency 和 QueryPerformanceCounter用法
- Scrapy爬虫报错AttributeError: ‘NoneType‘ object has no attribute ‘write‘
- 三维点云学习(4)4-Hough Transform
- adb.exe已停止工作
- LINUX SHELL中大小写转换及注意事项
- lsass.exe是什么?
- 从传课网论公司是否要卖给资方控股
- 微信JSAPI之V3版本支付踩坑
- 地理坐标系:WGS84和BD09互转
- namecheap,namesilo域名注册优势,国外域名注册,2018 namesilo注册优惠码
- 2021钳工技能高考成绩查询,这里有2021钳工时间和报名费用以及流程
- IIS 编译器错误消息: CS0016未能写入输出文件“c:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files\roo
- Linux拓展之字段分隔符IFS
- 五款高人气商城热销蓝牙耳机,低延迟手游党最爱蓝牙耳机品牌
- 2019 CCPC wannfly winter camp Day 8