2021-03-21多线程

三.多线程

1.并行与并发

并行是指在同一时间段多个事件在不同的处理器处理,并发是指多个事件在同一个时间端被单个处理器快速切换处理

2.线程与进程

进程是资源分配的最小单位,线程是cpu调度的最小单位,一个进程至少有一个线程,进程之间不会互相影响,一个线程的死掉将会导致整个进程的崩溃,进程与进程之间共享数据比较麻烦,但是同一个进程下的线程共享数据简单,线程不需要独立的内存资源,在一个进程下,可以加相应的锁,比如互斥锁,当一个线程占用时,其他线程必须等待。

3.守护线程

在java中线程分为两种,一种是用户线程,一种是守护线程,对于所有的非守护线程来说,守护线程相当于他们的保姆,完成一些系统性的工作,比如gc回收线程。用户线程是系统的工作线程,当用户线程全部结束,代表这个程序无事可做,,那么他就应该关闭了,所以当只剩下守护线程时,java虚拟机自然退出

4.创建线程

5.创建线程的几种方式

总有有三种继承thread类重写run方法,实现runable接口,与callable加futrue方法,实现callable接口中的call()作为执行体 然后将实现类的对象传入futrue,在通过new Thread(futrue).start启动线程

6.callable与runable创建的线程有什么不同

callable的执行体为call,runable为run,通过callable创建的futrue方法还有返回值。

7.线程有哪些状态

创建线程之后处于新建状态(new),调用线程对象的start()方法之后处于就绪状态(runable),获得cpus权限之后为运行状态(running),当出现io请求,调用wait(),sleep()方法,获取同步锁失败,进入阻塞状态(block) ,run()方法运行结束和异常退出,线程进入死亡状态(dead)

8.sleep()与wait()有那些区别

sleep()方法执行,对象不释放同步锁资源,cpu不再占用,
wait()方法对象释放锁资源,需要调用notify()回到可执行状态
sleep()是属于线程类的方法,wait属于objcet类的方法 。

9.notify()和 notifyAll()有什么区别?

notify()随机唤醒一个线程去争夺锁资源,notifyAll()唤醒全部线程去争夺锁资源

10.线程的run()与start()有什么区别

run()执行调用这个方法不h会执行拥有线程的特性,start()方法才会有

11.创建线程池有哪几种方式

newSingleThreadExecutor创建一个单线程的线程池,保证所有的任务按提交的顺序执行。
newFixedThreadPool创建一个固定数量的线程池,每有一个任务就新建一个线程池,达到最大数量之后就不再新建了。
newCachedThreadPool创建一个可缓存的线程池,当任务数量超过线程池容量时,便增加线程数,当任务少于线程数时,便会回收没有任务的线程
newScheduledThreadPool定长线程池,执行周期性任务

12. 线程池中的submit与execute有什么区别

线程中有两类,一种实现runable接口,一种实现callable接口,
execute(runable)可以执行,但是无法判断线程的执行成功与否
submit(callable)可以通过返回值判断线程的执行成功与否

13.在java程序中怎么保证多线程的运行安全

第一中同步代码块,第二种同步方法,通过lock()实现线程安全(互斥同步悲欢锁,) 此外还有非阻塞方法乐观锁,cas先进行操作,如果没有其它线程争用共享资源那么就更新成功,如果有进行补偿措施(一般是重复多次直到成功)

14.多线程锁升级的原理是什么

锁对象的对象头个threadid字段,第一次访问的时候threadId为空jvm让其执偏向锁,并将threadId设置为其线程id,再次进入的时候,如果线程id与threadid相同,则其获得对象,如果不同,jvm将其设置为轻量级锁,自旋去获取锁,自旋到一定次数之后,锁升级为重量级锁。
锁升级的目的是为了减少锁的带来的性能消耗

15.死锁是什么如何防止

当两个以上的进程分别需要对方的结果时就会造成死锁,也就我等你,你也等我。参生死锁的四个1.资源互斥2.占用切等待3.不可抢夺4.循环等待,破坏其中一个即可 第一个。如果所有的资源都能共享,那么就不会存在死锁问题,但关键在于有些资源注定不能共享,破坏第二种,一个进程启动立即为其分配其所需要的所有资源,容易造成浪费。破坏第3中,当一个进程已经占用不可剥夺的资源,并且请求资源又遭到阻塞那么他就必须释放占用的资源以便于其他进程使用,缺点是先前完成的工作又需要重新开始。4破坏循环等待,采用顺序资源分配法,给相应的进程,资源进行编号按照编号进行请求,这种方法不实用。

16. ThreadLocal是什么,有那些运用场景

ThreadLocal相当于挂载在线程中的一个变量,与synchronized都是处理线程并发问题的,不同s后者通过锁的方式让多个线程访问同一个资源,前者相当于创建一个副本让每个线程都有自己独立的资源,将资源隔离来解决并发问题,比如数据库管理,session管理

17.synchronized底层实现原理

。。

18.synchronized与volatile的区别

synchronized是锁住对象,volatile是保持对象在线程中随时可见

19.synchronized与lock的区别

lock是一个接口,synchronized是Java中一个关键字,lock是一个类,synchronized存在于jvm上。lock可以判断锁的获取与否通lock,unlock来获得与释放锁。从性能上来,在线程竞争不太激烈的时候,两者效果差不多,在竞争激烈的时候。lock将优于synchronized,但官方对与synchronized的不断优化,未来可能会更好。

20.synchronized与Reentrantlock的区别

reentrantlock采用的是乐观锁,synchronized采用的是悲观锁,前者可以设置中断与不中断 比如A与B线程争取一个资源,A获得了,但由于任务太多,一时难以返回,B线程就可以自己或被其他线程中断去干其他事,
中断,b线程中断或者被人中断,ReentantLock处理这个中断,B完全放弃
不中断,b线程中断或者被人中断,ReentantLock不处理这个中断,B继承等

21.说一下atomic的原理

原理不太清楚看不太懂 ,可以处理Cas中的aba问题 加版本号。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值