1.说说你知道的创建线程的方式

  • 1、继承Thread类,重写run方法。2、实现Runnable接口,重写run方法。3、实现Callable接口,重写call方法。4、通过线程池创建线程。

2.说说Runnable和Callable的区别

  • Callable可以返回一个类型V,而Runnable不可以。Callable能够抛出checked exception,而Runnable不可以。
  • Future和FutureTask留给你们!我放GitHub上了(uphe)

3.说说通过线方程池创建线程的式

  • Executors.newCachedThreadPool();创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
  • Executors.newFixedThreadPool(10);创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
  • Executors.newScheduledThreadPool(10);创建一个定长线程池,支持定时及周期性任务执行。
  • Executors.newSingleThreadExecutor();创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
  • 阿里巴巴开发手册上不推荐上面的创建方式,创建线程池推荐用ThreadPoolExecutor,其中ThreadPoolExecutor有七大参数,四大拒绝策略。
  • 1、int corePoolSize 核心线程池大小。2、int maximumPoolSize 最大核心线程池大小。3、long keepAliveTime 超时存活时间。4、TimeUnit unit 超时单位。5、BlockingQueue workQueue 阻塞队列。6、ThreadFactory threadFactory 线程工厂,用于创建线程。7、RejectedExecutionHandler handler 拒绝策略。
  • 四大拒绝策略,这里通过银行办理业务的例子进行说明。 1、AbortPolicy()); 银行满了还有人进来,不处理,抛出异常(默认)。2、CallerRunsPolicy(); 银行满了,不处理,哪里来的去哪里,一般抛给main线程。3、DiscardPolicy(); 银行满了,把该线程丢掉,不抛异常。4、DiscardOldestPolicy(); 银行满了,会和先来的线程竞争,不抛异常。

4.最大线程数是如何确定的呢

  • 一般有两种策略CPU密集型和IO密集型,所谓CPU密集型,也就是,几核的CPU就定义为几,我的是八核,所以定义为8,Runtime.getRuntime().availableProcessors(); 获取CPU的核数,IO密集型,就是判断程序中有多少个非常耗IO线程的程序,最大线程池的大小要大于这个值即可。

5.说说synchronized和Lock的区别

  • 1、synchronized是关键字,Lock是类。2、synchronized无法获取锁的状态,Lock可以。3、synchronized会自动释放锁,Lock需要手动。4、synchronized没有Lock锁灵活(Lock锁可以自己定制)。

6.说说ReentrantLock的应用场景

  • 1、ReentrantLock默认是非公平锁,但它可以设置公平锁,也就是谁先来的谁先获得锁new ReentrantLock(true)。2、ReentrantLock可以响应中断,也就是当两个线程发生死锁的时候,你把A线程中断了,B线程可以正常运行。3、ReentrantLock可以通过tryLock()实现限时等待,这样可以解决死锁问题。

7.synchronized锁的优化了解吗

  • synchronized在JDK1.6进行了锁的优化,也就是当一个线程多次访问一个同步代码块的时候,此时会记录该线程的threadId也就是,当你再来访问的时候,我就只需判断threadId就行了,效率高,这属于偏向锁。
  • 当有多个线程来的时候,那么这个锁就会升级为轻量级锁,也就是通过CAS,来进行尝试获取锁,是一种自旋锁的状态。如果在短时间内可以获得锁,不会堵塞,而且节约了CUP上下文切换的时间。
  • 如果长时间没有获取到锁,会消耗CUP的资源,因为在那一直死循环,经过一个时间段后会升级为重量级锁,会发生阻塞。其中锁升级是不可逆的。

8.说说对volatile关键字的理解

  • 三大特性保证可见性,不保证原子性,禁止指令重排。
  • 在说volatile之前,需要讲解一个东西,Java内存模型(Java Memory Model,JMM),当线程读取内存中的一个变量时,会先把这个变量拷贝到CPU的高速缓存区,然后对其进行操作,操作完成后,会把该变量写入到内存中。在单线程中是不会出现任何问题的,但是在多线程中就会有问题,当线程1读取了该变量a=1到缓存区进行了加1操作,还没写到内存中,线程2读取了内存中的变量a=1也进行加1操作,然后线程1写入内存a=2,线程2也写入a=2到内存,那么最后,该变量的值是2,而不是3(出现了线程安全问题)。
  • 我们想要当线程1进行了加1操作之后,让线程2知道,这就是volatile的作用了,可以保证可见性,也就是,当线程1对a变量进行了加1操作,会直接写入到内存中(立即马上),并且通知线程2,变量被修改了,要求线程2缓冲区的值去内存中重新读取。但是,加1操作不是原子性的(三步,首先读取a变量的值,然后对其进行加1操作,然后赋值给a),也就是说,当线程1读取a变量到缓冲区后,还没有修改a的值,此时线程2进来了,读取了a的值,并且对其进行了加1操作,由于可见性,会把线程1缓冲区的值进行修改,但是,线程1中的CPU已经读取了缓冲区的值,而且是更新前的值,所以出现了线程安全问题,也是volatile不保证原子性的问题。于是就需要加1操作是原子性操作,于是就有了一个automic包,通过该包下的方法,可以实现加1的原子性操作(还有其他原子性操作)。
  • 所谓指令重排,也就是在不影响单线程程序程序结果的情况下进行最优执行排序

9.那你说说CAS吧

  • CAS(Compare And Swap,比较并交换),如果我们想要修改某个值num,那么我们可以通过一个方法compareAndSet(5,6)意思是,我们期望num的值是5,如果是,就修改为6。但是这就会有一个问题,我们期望的num是5,如果有其他线程把5修改为了8,然后又修改为了5,最终是5,但是已经被修改过一次了,这就是ABA问题。我们可以通过AtomicStampedReference,也就是原子引用,在创建的时候,有一个印记,相当于版本号,每被修改一次,版本号都被更新,所以,当出现ABA问题的时候,我们就可以清楚的知道,被修改了多少次。

10.AQS了解吗

  • 不了解,回家等通知吧。了解的或者是感觉上面有问题的可以私聊我,我们一起探讨【贺贺学编程】

十个多线程并发编程面试题(附答案)相关推荐

  1. java编程的逻辑 京东,从阿里,京东等大厂面试题中提炼出25道最频繁出现的并发编程难题(附答案)...

    并发编程可以说是Java程序员必须掌握的技能之一,也是最难掌握的一种技能.它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰.思维缜密,这样才能写出高效.安全.可靠的多线程并发程 ...

  2. Java多线程并发编程知识体系(附大图-持续更新)

    Java多线程体系 1.并发编程的优势 提升CPU资源利用率 提升吞吐量 提升程序响应速度 更好的编程模型 2.并发带来的问题 1.安全性问题 0.定义:什么是安全性问题 多线程读写共享变量时出现不正 ...

  3. 狂刷这套Java并发编程面试题及答案(GitHub标星21.7K),五月收获美团/京东/字节Offer

    面试背景 2020-09初,从杭州某一外包公司离职,当然是由于个人原因,并非工作失误呐,因此当时对工作的交接,自认为还是OK的,没有遗留特别大的问题点.此时还处于一种不想找工作的时刻,毕竟刚离职,还想 ...

  4. 【2022最新Java面试宝典】—— Java并发编程面试题(123道含答案)

    目录 一.基础知识 1. 为什么要使用并发编程 2. 多线程应用场景 3. 并发编程有什么缺点 4. 并发编程三个必要因素是什么? 5. Java 程序中怎么保证多线程的运行安全? 6. 并行和并发有 ...

  5. java高并发面试题目_列举Java高并发面试题附答案解析

    Java高并发面试题是程序员面试过程中的必修课,只有熟练掌握这些技术要点,在我们的学习中才会脱颖而出,在这里,达内石家庄Java培训老师作深入解答. Java并发面试题附答案 1. 什么是原子操作?在 ...

  6. java书籍_还搞不定Java多线程和并发编程面试题?你可能需要这一份书单!

    点击蓝色"程序员书单"关注我哟 加个"星标",每天带你读好书! ​ 在介绍本书单之前,我想先问一下各位读者,你们之前对于Java并发编程的了解有多少呢.经过了1 ...

  7. JAVA 面试题附答案

    2019独角兽企业重金招聘Python工程师标准>>> JAVA 面试题附答案 声明,本人能力有限,只是列出来参考,不对之处欢迎指正. 一.JAVA基础 JAVA中的几种基本类型,各 ...

  8. 2020最新整理PHP面试题附答案

    2019最新整理PHP面试题附答案 1.什么事面向对象?主要特征是什么? 面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰.主要特征:封装.继承.多态. 2.SESSION 与 ...

  9. 2019最新整理JAVA面试题附答案

    2019最新整理JAVA面试题附答案 包含的模块: 本文分为十九个模块,分别是:Java 基础.容器.多线程.反射.对象拷贝.Java Web .异常.网络.设计模式.Spring/Spring MV ...

最新文章

  1. IE9最终版透露IE10信息 或将自动在线升级
  2. 11. mysqli 学习
  3. 数据结构---简单插入排序
  4. PHP使用指南,PHP使用指南-cookies部分
  5. 对vue-tree-select的封装
  6. python企业微信特定用户_python3调用企业微信api!开发一款属于自己的企业微信...
  7. 检查eth是否到账_税务检查视角:高新技术企业核查要点
  8. 群晖如何建php网站_群晖nas使用教程31:搭建个人网站ZBLOG
  9. E盾网络验证V60原版复活版包含已经改好的复活版服务端小白直接替换加密一机一码
  10. 为什么计算机不显示桌面工具栏,笔记本电脑开机后不显示桌面图标或任务栏怎么解决...
  11. ASCII码一览表,ASCII码对照表
  12. python中abs函数是什么意思_python abs函数怎么用
  13. protected 修饰符的使用
  14. “绿多多”绿色资产资讯:良设板+“空间优造”亮相雄安 绿色生态进击!
  15. linux俄罗斯方块源程序,《俄罗斯方块游戏》项目实作【附源码】
  16. Linux驱动学习--wifi驱动(rtl88xx系列网卡芯片)源码分析
  17. Google glog
  18. 标贝科技| AI裁判、写手、保姆…站在人性和技术的十字路口
  19. 1100 Mars Numbers (20分)
  20. 什么是Beta Finance

热门文章

  1. Firefox下去掉密码自动填充
  2. 发起图片请求的几种可能性(webkit内核)
  3. VB编程操作AutoCAD块对象
  4. zabbix api python使用
  5. 理解点击屏幕的事件响应---对UIView的hitTest: withEvent: 方法的理解
  6. 第10章 文档对象模型DOM 10.2 Document类型
  7. Nginx前端设置反向代理,后端Apache如何获取访客的真实IP,结合PHP
  8. WINDOWS2003自动开关机的实现
  9. 【maven】maven的介绍
  10. Lambda表达式改方法引用和构造器引用