1. 什么是进程
进程是指运行中的应用程序,每个进程都有自己独立的地址空间(内存空间)。
比如用户点击桌面的IE浏览器,就启动了一个进程,操作系统就会为该进程分配独立的地址空间。当用户再次点击左边的IE浏览器,又启动了一个进程,操作系统将为新的进程分配新的独立的地址空间。目前操作系统都支持多进程。
2. 什么是线程
进程是表示自愿分配的基本单位。而线程则是进程中执行运算的最小单位,即执行处理机调度的基本单位。通俗来讲:一个程序有一个进程,而一个进程可以有多个线程。
3. 多线程的几种实现方式
(1) 继承Thread类创建线程
- Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的
start()
实例方法。start()
方法将启动一个新线程,并执行run()
方法。这种方式实现多线程比较简单,通过自己的类直接继承Thread,并重写run()
方法,就可以启动新线程并执行自己定义的run()
方法。
- Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的
(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