JAVA面试总结之多线程与线程池【一】

前言

今年行情是真的不好,总结一句话就是狼多肉少,在经过了一段时间的磨练(打击)后将想到的与碰到的面试题分享出来,希望可以帮到大家,需要注意的是本章只写总结不写细节,要了解细节的朋友请自行搜索,最后说一句,不要放弃!尤其是某位开玩笑说要转行的朋友,多背背题肯定能找到的。

 

java线程锁


1.Synchronized,它就是一个:非公平,悲观,独享,互斥,可重入的重量级锁
2.ReentrantLock,它是一个:默认非公平但可实现公平的,悲观,独享,互斥,可重入,重量级锁,
reentrantlock可设置超时,不会死锁,可中断
3.ReentrantReadWriteLocK,它是一个,默认非公平但可实现公平的,悲观,写独享,读共享,读写,可重入,重量级锁。

以下是各种概念上锁的分类
1.悲观锁,乐观锁
2.独占锁,互斥锁
3.可重入,不可重入
4.重量级,轻量级
5.公平锁,非公平锁

这些锁并非是某个具体的java对象,而是锁的几种分类或者说概念,我一般是不会死记硬背的,我们应该知道这些东西,在需要用到的时间查下资料就能知道该选哪种锁了。

 

java实现线程的几种方式

1.thread
2.runnable
3.线程池
4.timer
5.FutureTask 带返回结果的线程

 

线程中的join()方法

join 让父线程等待子线程结束后才运行,join可指定等待时间

 

实现高并发秒杀的三种思路

1.mysql 数据库行锁  (通过 for update 和索引配合具体自行搜索)
2.使用redis的list存储秒杀数据使用lpop删除数组中的第一个下标的数据来表示减少库存,redis是单线程的
3.使用redis分布式锁,通过setnx方法获取锁,setnx是设置一个值,如果它不存在则设置成功返回1,否则失败返回0,再通过expire设置锁的超时时间,避免死锁,最后需要操作完后根据客户端请求唯一标识删除锁(为了避免误删)

 

 

线程池

两个核心配置说明:
keepAlivetime 排队时长,该参数只在当然线程求大于corePoolSize时有用

maxinumPoolSize最大线程执行数量,超过核心线程会自动创建非核心线程,前提是不超过maxinumPoolSize

线程池总体流程:
当用户提交线程时创建新线程执行直到线程数量等于corePoolSize,多出来的任务则加入队列,当队列满了且当前线程数小于maxinumPoolSize时创建新的线程执行任务,当队列满了且线程池执行数量超过设定上限则执行配置的拒绝策略。

 

java的四种线程池

1.newCachedThreadPool可缓存线程池,无限制扩展,无可回收时创建新的线程
2.newFixedThreadPool 固定数量大小的线程池,当任务超过线程数量时加入队列等待
3.newSingleThreadExecutor单线程化线程池,将所有线程按指定顺序如先进先出,先进后出的顺序执行
4.newScheduleThreadPool 定长的线程池,支持
定时周期性的任务执行

线程池的4种拒绝策略
1.discardPolicy 直接丢弃
2.discardOldestPolicy丢弃队列中最老的任务
3.abortPolicy抛异常
4.callerRunsPolicy将任务分给调用线程来执行,但调用者线程性能会下降
默认策略抛异常

线程池的4种队列:
1.ArrayBlockingQuene 数组结构,有序,先进先出(FIFO)
2.LinkedBlickingQuene 链表结构,先进先出,吞吐量高于数组结构
3.SynchronousQuene无缓冲队列,当第一个任务添加进该队列后会一直处于阻塞状态,直到有线程将调用take方法取走元素,该队列不保存元素,添加进来的元素会直接被消费方取走
支持公平,非公平策略,非公平策略有可能取不到元素
4.priorityBlockingQuene具有优先级的无阻塞队列,可自定义竞争算法
 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值