money 多线程

多线程

1、多线程有什么用?

提高程序运行效率

2、线程和进程的区别是什么?

进程是资源分配的最小单位,线程是内存调度的最小单位,
线程是进程的更小单位,进程是父,线程是子

3、Java实现线程有哪几种方式?
Thread/Runnable
而其他注入Callabll/Future等核心仍旧是使用Runnable

4、启动线程方法start()和run()有什么区别?
start方法会调用native方法去启动线程,然后回调run方法

5、怎么终止一个线程?如何优雅地终止线程?
Thread.interrupt()/throw/return

6、一个线程的生命周期有哪几种状态?它们之间如何流转的?

new->Runnable->Running->Block->dead(阻塞后回到可运行状态)

7、线程中的wait()和sleep()方法有什么区别?
wait方法会放弃这个对象的监视器,即释放锁
而sleep方法只是休眠,放弃CPU一段时间,仍旧持有锁

8、多线程同步有哪几种方法?
synchronized violatile Lock

9、什么是死锁?如何避免死锁?

线程间资源互斥造成死锁,都在等对方的锁释放,而且一直等
a.顺序得到锁
b.锁持有的超时机制
c.使用CAS方法 即lock 只要能正确unlock则不会出现死锁

10、多线程之间如何进行通信?

wait/notify等待通知机制
Condition条件锁机制 lock维护的等待队列 没有上锁没有等待 只是获取不到资源在自旋而已
读写锁机制

11、线程怎样拿到返回结果?

尝试获取返回值,如果线程状态未完成,则等待,直到线程状态是完成状况
实现Callable接口。

12、violatile关键字的作用?

保证线程间的可见性/防止重排序
->怎么保证的呢?
 首先的理解java内存模型JMM,规定了工作内存和主内存之间的数据交换的要求

根据这个JMM规定,violatile就是沿用这个可见性,每次读都是主内存,写都立刻在主内存相应
这是通过增加内存屏障实现的,而这个内存屏障同时又防止CPU的重排序
这种有一个小漏洞,就是必须让CPU空闲的情况下才会去重新读取主内存值
比如while(violatile flag){i++;} 这样一个操作就不会有时间重新读取 也就是会造成线程安全问题

实践中并发包就是基于violatile关键和CAS实现的

13、新建T1、T2、T3三个线程,如何保证它们按顺序执行?

1.单线程效果:t1.join()->t2.join()
2.状态限定: t1.run():while(i==1){do() } i++;
3.线程通信:

14、怎么控制同一时间只有3个线程运行?

并发包下的,信号量Semaphore:基于AQS的,释放资源就是信号数+1,获取资源就是信号数!=0 -1

15、为什么要使用线程池?***********

省去创建消费线程所耗费的资源
线程池又是怎么保证不被销毁的呢?
1.可以static List<Thread>
2.自循环

16、常用的几种线程池并讲讲其中的工作原理。***********

ThreadPoolExecutor Executors缓存线程池/单线程池/固定数量线程池

17、线程池启动线程submit()和execute()方法有什么不同?

execute没有返回值,如果不需要知道线程的结果就使用execute方法,性能会好很多。
submit返回一个Future对象,如果想知道线程结果就使用submit提交,而且它能在主线程中通过Future的get方法捕获线程中的异常。

18、CyclicBarrier和CountDownLatch的区别?

CyclicBarrier:挡板,人齐了才开始开会,可以接受一个Runnable(开会)回调
CountDownLatch:作用是等待子线程全部完成,基于AQS,释放资源就是资源state-1,主线程获取资源就是判断state==0 否则就是等待。要也可以同时去唤醒多个子线程

19、什么是活锁、饥饿、无锁、死锁?

活锁:一直在重试
饥饿:CPU转不到这个线程上,就饿死了
无锁:正常单线程程序
死锁:资源互斥

20、什么是原子性、可见性、有序性?
JMM是从这三个特性进行展开的
原子性:操作原子性
可见性:线程间总是能看见其他线程对值的改变
有序性:确保不会出现指令重排序 就能保证有序性

21、什么是守护线程?有什么用?

会一直在后台运行,就比如GC线程

22、一个线程运行时发生异常会怎样?

线程中断

23、线程yield()方法有什么用?

释放CPU,并和其他线程再次竞争

24、什么是重入锁?

即同步方法可以再次进入同一个对象的同步方法中,

一个线程获取了一个对象的锁后,可以继续获取这个对象上的锁

25、Synchronized有哪几种用法?

锁类、锁方法、锁代码块。

26、Fork/Join框架是干什么的?

大任务自动分散小任务,并发执行,合并小任务结果。 

27、线程数过多会造成什么异常?

造成运行缓慢CPU需要切换上下文
线程本身需要的内存资源可能不足 栈溢出

28、说说线程安全的和不安全的集合。

ArrayList Vertor(synchronized 方法) 
Collections.synchronizedList (synchronized 代码块)
java.util.concurrent.CopyOnWriteArrayList

HashMap HashTable(synchronized 方法)
Collections.synchronizedMap(synchronized 代码块)
java.util.concurrent.ConcurrentMap(CAS)

29、什么是CAS算法?在多线程中有哪些应用。

Compare and Swap,是计算机硬件支持的原子性操作 比较和交换
if(内存值a==oldValue){a=newValue} 这是原子性

CAS基本都是配合volatile的可见性特性来实现线程安全的,
1.java.util.concurrent.atomic包
2.AQS框架就是基于此的,Lock/countDownLatch等

30、怎么检测一个线程是否拥有锁?

Thread类中有静态方法 holdsLock方法

31、Jdk中排查多线程问题用什么命令?

jstack/jconsole

32、线程同步需要注意什么?

1.减少同步范围
2.分布式同步锁无意义,要使用分布式锁。
 (实际应用:magnum pdf线程生成使用数据库的状态值来实现1主2从2备的分布式集群锁,避免多次重复生成 uws基本是这么个逻辑)
3.防止死锁,注意加锁顺序。

33、线程wait()方法使用有什么前提?

wait是监视器方法,需要放在synchronized中 否则运行时就会报非法的监视器状态异常

34、Fork/Join框架使用有哪些要注意的地方?

如果任务拆解的很深,系统内的线程数量堆积,导致系统性能性能严重下降;
如果函数的调用栈很深,会导致栈内存溢出;

35、线程之间如何传递数据?

堆区的数据就可以共享
final/static/object

36、保证”可见性”有哪几种方式?

synchronized和viotatile

37、说几个常用的Lock接口实现锁。

可重入锁ReentrantLock、读写锁ReadWriteLock

38、ThreadLocal是什么?有什么应用场景?

线程本地变量,使用Map记录 key是线程,这样就可以记录每个线程独有的值
每个线程需要独立的副本的时候

spring的广泛利用threadLocal保证有状态bean的单例,线程安全

39、ReadWriteLock有什么用?

读写锁,减少资源的竞争,读写分离,写锁是排他锁,但读写共享,提升读的性能

40、FutureTask是什么?

未来任务,异步运算任务 调用callable

41、怎么唤醒一个阻塞的线程?

IO阻塞的无能为力
wait/notify等待通知机制

42、不可变对象对多线程有什么帮助?

不可变对象保证了对象的内存可见性,对不可变对象的读取不需要进行额外的同步手段,提升了代码执行效率。

43、多线程上下文切换是什么意思?

多线程的上下文切换是指CPU控制权由一个已经正在运行的线程切换到另外一个就绪并等待获取CPU执行权的线程的过程。

44、Java中用到了什么线程调度算法?

抢占式。一个线程用完CPU之后,操作系统会根据线程优先级、线程饥饿情况等数据算出一个总的优先级并分配下一个时间片给某个线程执行。

45、Thread.sleep(0)的作用是什么?

让其他线程重新抢占CPU

46、Java内存模型是什么,哪些区域是线程共享的,哪些是不共享的?

JMM和java运行时内存区域
堆区共享 方法区
栈区不共享 本地方法区不共享

47、什么是乐观锁和悲观锁?

乐观锁:就像它的名字一样,对于并发间操作产生的线程安全问题持乐观状态,乐观锁认为竞争不总是会发生,因此它不需要持有锁,将比较-替换这两个动作作为一个原子操作尝试去修改内存中的变量,如果失败则表示发生冲突,那么就应该有相应的重试逻辑。

悲观锁:还是像它的名字一样,对于并发间操作产生的线程安全问题持悲观状态,悲观锁认为竞争总是会发生,因此每次对某资源进行操作时,都会持有一个独占的锁,就像synchronized,不管三七二十一,直接上了锁就操作资源了。

48、Hashtable的size()方法为什么要做同步?

一个线程要去size,一个线程在写,那取到的size是写之前的还是写之后的呢?
如果不加synchronized,调用size不需要获取锁 都可以调用,结果是不确定的 
加了synchronized,则可以确保有线程写的时候 其他线程是互斥的,无法调用size的

49、同步方法和同步块,哪种更好?

同步块,这意味着同步块之外的代码是异步执行的,这比同步整个方法更提升代码的效率。请知道一条原则:同步的范围越小越好。

50、什么是自旋锁?

while(flag){} do()

51、Runnable和Thread用哪个好?

接口会更便于扩展。

52、Java中notify和notifyAll有什么区别?

notify()方法不能唤醒某个具体的线程,所以只有一个线程在等待的时候它才有用武之地。而notifyAll()唤醒所有线程并允许他们争夺锁确保了至少有一个线程能继续运行。

53、为什么wait/notify/notifyAll这些方法不在thread类里面?

从java的设计角度,这些都是对象的监视器方法,锁是对象级的,而不是线程级的,所以这些方法放在对象中更准确

54、为什么wait和notify方法要在同步块中调用?

主要是因为Java API强制要求这样做,如果你不这么做,你的代码会抛出IllegalMonitorStateException异常。还有一个原因是为了避免wait和notify之间产生竞态条件。

55、为什么你应该在循环中检查等待条件?

while(flag){wait()} vs if(flag){wait}
被其他线程notify时 flag不一定已经改了 while能确保再次确认flag的值

56、Java中堆和栈有什么不同?

java运行时内存区域,最重要的就是堆和栈,栈存储本地变量,随线程的开始结束入栈出栈,堆是共享的内存区域,主要存储对象

57、你如何在Java中获取线程堆栈?

jconsole可视化堆栈信息

58、如何创建线程安全的单例模式?
内部类是延时加载的,只有调用时才会被加载

59、什么是阻塞式方法?

程序等待有返回值 否则不执行

60、提交任务时线程池队列已满会时发会生什么?

放入等待队列 等待队列也满了的话就 确认线程数量是否达到max,如果没达到则继续创建线程,达到了就根据拒绝策略 抛异常/什么都不做/或者替换等待队列中的第一个;

Mybatis

1、#{} vs ${}的区别
2、mybaits的如何进行分页 原理是什么
3、Mybatis的一级缓存和二级缓存
4、Mybatis是否支持延迟加载?如果支持 原理是什么
5、Mybatis的执行器有哪些?区别
6、为什么说Mybatis是半自动的ORM框架?
7、.MyBatis编程步骤是什么样的?
8、 模糊查询like语句该怎么写?
9、通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
10、Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
11、如何执行批量插入?
12、如何获取自动生成的(主)键值?
13、Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?
14、 一对一、一对多的关联查询 ?

->
1、#{}是预编译处理,会解析成? 然后set 。${}是字符串替换 被解析成变量的值
2、mybatis的分页不用处理 mybatis有分页插件 拦截sql并拼凑分页查询语句
3、一级缓存:SqlSession级别
二级缓存:namespace级别 不用开 可以用redis等第三方缓存
4、延迟加载,当发现为null时再去加载
5、SimpleExctor 默认的 BatchExcutor批处理 将所有sql缓存着 最后一次传送
6、ORM是object与realtion的相互映射,而mybatis的object-relation部分并未做,而是指定#{参数},只做了relation-object的部分,即resultMap部分,所以是半自动 而hibernate是全自动的
7、
8、select * from my_table where name like “%”#{param}”%”
9、在spring加载期间,对dao层和xml进行扫描,通过动态代理得到dao层的代理实例并装配进行IOC中,所以在调用接口方法时实际上是调用这个动态代理实现类,而这个实现类实际执行的依照对xml的解析对应的namespace+id得到的方法,所以不能有重载
10、ResultHandle ,映射形式resultType/resultMap/intString之类
11、批量执行器BatchExcutor,不能用mapper接口形式了 需要手动SqlSession。opensession(batch);
或者拼凑sql 用foreach标签
12、usegeneratedkeys=true
13、 动态sql就是xml中的<\if><\when><\choose>等标签实现sql不同条件下不同
14、association 一对一 Collection一对多

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值