当前位置:   article > 正文

牛客面试题库(1)

牛客面试题库

线程和进程的区别

进程:操作系统分配资源的基本单位,例如JVM进程、.exe可执行文件运行后是进程、main主方法是线程

线程:任务调度和执行的基本单位

一个进程包含多个线程,进程有独立的内存空间,线程共享堆、方法区,私有程序计数器、虚拟栈、本地方法栈

MySQL索引坏处和好处

好处:加快查询效率,类似书的目录

坏处:索引需要存储到磁盘,增加存储的压力

注意:定义了索引不一定生效,例最左前缀,id、name、age,(name、age)

多线程

进程包含多个线程,进程能够并发执行多个线程,即可以执行多个任务

优点:提升程序运行效率,减少响应时间

如何保证线程安全

多线程同时操作共享资源时就会出现线程安全问题

解决方案:原子类、volatile、锁

原子类:JUC(java.util.concurrent)包下的atomic包的类,通过CAS(compare and swap)比较与交换来保证单个变量的线程安全,CAS通过预期值和内存值的比较来判断是否修改

volatile:实现变量的可见性、防止指令重排,防止指令重排意思是只能向一个方向操作,防止颠倒,例如还没赋值就使用了

锁:保证多个变量的线程安全

  • synchronize关键字:给对象加锁,防止其他线程访问共享资源,进而保证临界区内的变量在多线程下的安全,主要是通过flag标记acc-synchronize,线程执行先获取同步锁,其次执行方法,最后释放锁
  • lock接口:lock锁住,unlock解锁,基于AQS(AbstractQueueSynchronizer)抽象队列同步器实现,加锁解锁实际是操作AQSstate变量

补充:

  • JUC包下的类,例Semaphore信号量、CountDownLatchCyclicBarrier

  • ThreadLocal:为每个线程创建单独的资源,线程之间互不影响,即把共享资源复制成多份,它们访问的是自己独占的资源,隔离了多个线程之间的数据共享

死锁定义及发生的条件

定义:两个或两个以上的进程争夺共享资源造成互相等待,如果没有外力的作用,则一直等待下去,这种状态就称为死锁

4个必要条件:必要条件说明发生死锁,一定有四个条件,但四个条件都成立,不一定发生锁

  • 互斥:一个资源在同一个时刻只能被一个进程使用
  • 请求与保持:一个进程拥有一个资源,但还需要请求另一个资源,但该资源已经被其他进程使用,所以需要一直等待该资源释放,同时对自己的资源一直不释放
  • 不可剥夺:资源使用完后只能进程自己释放,未使用完其他进程不可剥夺
  • 循环等待:形成一个死循环,例如进程p1等待p2资源,p2等待p3pn-1等待pnpn等待p1

进程间的通信方式

  1. 通过管道
  2. 信号量
  3. 消息队列
  4. 共享内存
  5. 套接字socket
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/790148
推荐阅读
相关标签
  

闽ICP备14008679号