前言

面试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个线程卡死计算机。

内存模型,也说点简单的

    1. 栈(heap),函数加载的时候,为函数内部变量分配的空间。和父函数的内部变量和运行指针共享同一块区域。
    1. 函数运行时,new的空间,都是放在堆中的。

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

作者:白头雁
链接:https://www.jianshu.com/p/8cb...

终于,我还是码造一个了中国地图

SVG前戏—让你的View多姿多彩

分享几个Android很强势的的开源框架

(Android)面试题级答案(精选版)

Java并发面试,幸亏有点道行,不然又被忽悠了 1相关推荐

  1. 多线程面试题_100多线程和Java并发面试问答–最终清单(PDF下载)

    多线程面试题 在这篇文章中,我们将提供有关多线程和Java并发面试问答的综合文章. 编者注:并发始终是开发人员的挑战,编写并发程序可能非常困难. 引入并发时,有很多事情可能会崩溃,并且系统的复杂性会大 ...

  2. 并发执行变成串行_大白话Java并发面试问题之Java 8如何优化CAS性能?

    专注于Java领域优质技术,欢迎关注 来自:石杉的架构笔记 一.前言 这篇文章给大家聊一下java并发包下的CAS相关的原子操作,以及Java 8如何改进和优化CAS操作的性能. 因为Atomic系列 ...

  3. Java并发面试,幸亏有点道行,不然又被忽悠了

    2019独角兽企业重金招聘Python工程师标准>>> 前言 面试Java,必然要被问Java内存模型和Java并发开发.我被问到的时候,心里慌得一批,"额,是在<T ...

  4. java 并发 面试_Java 并发基础常见面试题总结

    1. 什么是线程和进程? 1.1. 何为进程? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的.系统运行一个程序即是一个进程从创建,运行到消亡的过程. 在 Java 中,当我们启 ...

  5. Java 并发面试题解

    作为一名专业的 Java 开发者,如何在并发场景中写出优良的代码,是一道绕不开的坎,也是考量一个 Java 开发者功底的关键技术.因此,不难发现 Java 并发问题一直是各个大厂面试的重点之一,然而我 ...

  6. 【搞定 Java 并发面试】面试最常问的 Java 并发进阶常见面试题总结!

    本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习 面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.觉得内容不错 ...

  7. Java并发面试宝典,并发相关面试再也难不倒你!

    1.在java中守护线程和用户线程的区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon ...

  8. 大白话系列之java_并发系列2-大白话聊聊Java并发面试问题之Java 8如何优化CAS性能?【石杉的架构笔记】...

    Lua-面向对象中函数使用时冒号(:)和点(.)的区别 先来看一段简单的代码: local Animal = {} function Animal:Eat( food ) print("An ...

  9. 面试问到java并发_那些面试官必问的JAVA多线程和并发面试题及回答

    Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环 ...

  10. java多线程面试_Java多线程和并发基础面试问答,看过后你不会后悔

    ***:Java多线程面试问题 1:进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java ...

最新文章

  1. 腾讯提结合ACNet进行细粒度分类,效果达到最新SOTA | CVPR 2020
  2. 【Java】eclipse如何导入项目
  3. 使用R画桑基图(流程图)
  4. Lambda架构与推荐在电商网站实践
  5. 萝卜家园win11系统32位微软原版镜像v2021.08
  6. QueryPerformanceFrequency 和 QueryPerformanceCounter用法
  7. Scrapy爬虫报错AttributeError: ‘NoneType‘ object has no attribute ‘write‘
  8. 三维点云学习(4)4-Hough Transform
  9. adb.exe已停止工作
  10. LINUX SHELL中大小写转换及注意事项
  11. lsass.exe是什么?
  12. 从传课网论公司是否要卖给资方控股
  13. 微信JSAPI之V3版本支付踩坑
  14. 地理坐标系:WGS84和BD09互转
  15. namecheap,namesilo域名注册优势,国外域名注册,2018 namesilo注册优惠码
  16. 2021钳工技能高考成绩查询,这里有2021钳工时间和报名费用以及流程
  17. IIS 编译器错误消息: CS0016未能写入输出文件“c:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files\roo
  18. Linux拓展之字段分隔符IFS
  19. 五款高人气商城热销蓝牙耳机,低延迟手游党最爱蓝牙耳机品牌
  20. 2019 CCPC wannfly winter camp Day 8

热门文章

  1. Java语言程序设计基础篇第10版第5章习题答案
  2. 针对大的sql文件删除行操作
  3. 编程菜鸟的日记-初学尝试编程递归
  4. Sudoku Solver
  5. oracle 自增加列的实现
  6. 雪碧+滑动门,自适应宽度菜单
  7. BZOJ3744 Gty的妹子序列(分块+树状数组)
  8. Java--UI--弹出对话框
  9. equals 跟== 的区别
  10. R|ggplot2(七)|自定义主题