高并发面试总结

1. 什么是进程

进程是指运行中的应用程序,每个进程都有自己独立的地址空间(内存空间)。
比如用户点击桌面的IE浏览器,就启动了一个进程,操作系统就会为该进程分配独立的地址空间。当用户再次点击左边的IE浏览器,又启动了一个进程,操作系统将为新的进程分配新的独立的地址空间。目前操作系统都支持多进程。

2. 什么是线程

进程是表示自愿分配的基本单位。而线程则是进程中执行运算的最小单位,即执行处理机调度的基本单位。通俗来讲:一个程序有一个进程,而一个进程可以有多个线程。

3. 多线程的几种实现方式

  • (1) 继承Thread类创建线程

    • Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法将启动一个新线程,并执行run()方法。这种方式实现多线程比较简单,通过自己的类直接继承Thread,并重写run()方法,就可以启动新线程并执行自己定义的run()方法。
  • (2) 实现Runnable接口创建线程

    • 如果自己的类已经继承了两一个类,就无法再继承Thread,因此可以实现一个Runnable接口
  • (3) 实现Callable接口通过FutureTask包装器来创建Thread线程

  • (4) 使用ExecutorService、Callable、Future实现有返回结果的线程

    • ExecutorService、Callable、Future三个接口实际上都是属于Executor框架。返回结果的线程是在JDK1.5中引入的新特征,有了这种特征就不需要再为了得到返回值而大费周折了。
    • 可返回值的任务必须实现Callable接口;无返回值的任务必须实现Runnabel接口。
    • 执行Callable任务后,可以获取一个Future对象,在该对象上调用get()方法就可以获取到Callable任务返回的Object了。(get()方法是阻塞的,线程无返回结果,该方法就一直等待)

4. Vector、SimpleDateFormat是线程安全类吗

Vector类的单个方法是原子性的,符合操作不是原子性的
SimpleDateFormat类不是线程安全的

5. 哪些集合类是线程安全的

  • 1.Vector
  • 2.Stack
  • 3.hashtable
  • 4.enumeration
  • 5.StringBuffer

6. 多线程中忙循环是什么

忙循环就是程序员用循环让一个线程等待,不像传统方法wait()sleep()或者yied()它们都放弃了CPU控制,而忙循环不会放弃CPU,它就是在运行一个空循环。这么做的目的是为了保留CPU缓存,在多核系统中,一个等待线程醒来的时候可能会在另一个内核运行,这样会重建缓存。为了避免重建缓存和减少等待重建的时间就可以使用它了。

7. 什么是线程局部变量

ThreadLocal并非是一个线程本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更合适。线程局部变量(ThreadLocal)功能非常简单,就是为每一个使用该变量的线程都提供了一个变量值副本,是java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突。

8. 进程间如何通讯

  • 管道(pipe)

    • 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系
  • 有名管道(namedpipe)

    • 有名管道也是半双工的通信方式,但是它云溪无亲缘关系进程间的通信。
  • 信号量(semaphore)

    • 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
  • 消息队列(messagequeue)

    • 消息队列里有消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递消息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点
  • 信号(signal)

    • 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生
  • 共享内存(shared memory)

    • 共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信。
  • 套接字(socket)

    • 套接口也是一种进程间通信机制,以其他通信机制不同的是,它可用于不同进程间的通信

9. 线程间如何通讯

  • 锁机制:包括互斥锁、条件变量、读写锁

    • 互斥锁提供了以排他方式防止数据结构被并发修改的方法
    • 读写锁允许多个线程同时读共享数据,而对写操作是互斥的
    • 条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
  • 信号量机制:包括无名线程信号量和命名线程信号量

  • 信号机制:类似进程间的信号处理

线程间的通信目的只要是用于新城同步,所以线程没有像进程通信中的用于数据交换的通信机制。

10. 什么是多线程环境下的伪共存(false sharing)

缓存系统中是以缓存行为单位存储的。缓存行是2的整数幂个连续字节,一般为32-256个字节。最常见的缓存行大小是64个字节。当多线程修改互相独立的变量时,如果这些变量共享同一个缓存航,就会无意中影响彼此的性能,这就是伪共存

11. 同步和异步有何不同,在什么情况下分别使用它们?举例说明

  • 如果数据将在线程间共享。例如:正在写的数据以后可能会被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取
  • 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效。

同步交互&#x

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值