一:概述
线程安全是软件开发中一个非常重要的概念,尤其在多线程环境下。
1.线程安全基本概念 ----线程、程序、进程的定义以及区别
程序:一组计算机能识别和执行的指令、它是一些保存在磁盘上的指令的有序集合
进程:进程是一个独立的可调度的任务,进程是一个抽象的实体,当系统在执行某个程序时,
分配和释放的各种资源,进程是资源分配的总称。
线程:共享同一个进程地址空间的多个任务叫线程。
进程是程序的实体,而线程又是进程的实体。进程又是线程的容器。
2.什么是线程安全?
线程安全是指多个线程访问同一资源时,不会导致数据不一致或程序错误的情况。
3.线程安全问题产生的原因是什么?
线程安全问题主要是由于多个线程对共享资源的竞争访问导致的。
4.常见的线程同步机制有哪些?
- 互斥锁(Mutex)
- 读写锁(Read-Write Lock)
- 条件变量(Condition Variable)
- 信号量(Semaphore)
5.请解释互斥锁的概念及作用?
互斥锁是一种保证共享资源在同一时间只能被一个线程访问的机制。互斥锁的作用是防止多个线程同时访问共享资源,导致数据不一致。
6.如何实现一个简单的互斥锁?
以下是一个简单的互斥锁实现:
import threading
class Mutex:
def __init__(self):
self.lock = threading.Lock()
def acquire(self):
self.lock.acquire()
def release(self):
self.lock.release()
7.什么是死锁?
死锁是指两个或多个线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉,它们都将无法继续执行。
8.如何避免死锁?
- 确保资源请求的顺序一致
- 避免循环等待
- 设置超时时间
- 使用try-finally语句块确保释放资源
9.什么是饥饿?
饥饿是指一个线程长时间无法获得所需资源,导致无法执行的情况。
10.Java 中实现多线程有几种方法,分别是什么?
继承
Thread
类;
实现
Runnable
接口;
实现
Callable
接口通过
FutureTask
包装器来创建
Thread
线程;
使用
ExecutorService
、
Callable
、
Future
实现有返回结果的多线程(也就是使用了
ExecutorService
来管理前面的三种方式)。
11.线程的状态

12.线程的生命周期
新建状态(
New
):当线程对象对创建后,即进入了新建状态,如:
Thread t = new MyThread();
就绪状态(
Runnable
):当调用线程对象的
start()
方法(
t. start();
),线程即进入就绪状态。
处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待
CPU
调度执行,并不是
说执行了
t.start()此线程立即就会执行;
运行状态(
Running
):当
CPU
开始调度处于就绪状态的线程时,此时线程才得以真正执行,
即进入到运行状态。
注:就绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,
首先必须处于就绪状态中;
阻塞状态(
Blocked
):处于运行状态中的线程由于某种原因,暂时放弃对
CPU
的使用权,
停止执行,此时进入 阻塞状态,直到其进入到就绪状态,才 有机会再次被
CPU
调用以进
入到运行状态。根据阻塞产生的原因不同,
阻塞状态又可以分为三种:
1.
等待阻塞
--
运行状态中的线程执行
wait()
方法,使本线程进入到等待阻塞状态;
2.
同步阻塞
--
线程在获取
synchronized
同步锁失败
(
因为锁被其它线程所占用
)
,它
会进入同步阻塞状态;
3.
其他阻塞
--
通过调用线程的
sleep()
或
join()
或发出了
I/O
请求时,线程会进入到阻
塞状态。当
sleep()
状态超时、
join()
等待线程终止或者超时、或者
I/O
处理完毕时,线程重
新转入就绪状态。
死亡状态(
Dead
):线程执行完了或者因异常退出了
run()方法,该线程结束生命周期。
13.什么是(多)线程安全?
线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行
执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不
会出现数据污染等意外情况。
14.线程中常用的方法为什么在 object 中?
1
、这些方法存在于同步中;
2
、使用这些方法必须标识同步所属的锁;
3
、锁可以是任意对象,所以任意对象调用方法一定定义在
Object 类中。
15.synchronized 的作用是什么?
synchronized
关键字解决的是多个线程之间访问资源的同步性,
synchronized
关键字可以保
证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。
作用位置:
对象锁:
synchronized
修饰对象或者方法,默认锁对象为
this
,当前实例对象
方法锁:
synchronized
修饰普通方法,锁对象默认为
this
同步代码块锁:
synchronized
修饰代码块,自己指定锁对象
类锁:
synchronize
修饰静态的方法或指定锁对象为
Class
对象
每一个对象在同一时间只与一个
monitor(
锁
)
相关联,而一个
monitor
在同一时间只能被一个
线程获得