线程安全
- 死锁
两个或以上进程在执行中,由于竞争关系或者彼此通信而造成的一种阻塞线程,若无外力介入,他们都将无法推进下去 - 死锁的四个条件
互斥条件:资源只有一个进程占用。
请求和保持提哦啊叫:进程已经保持一个资源,但又提出新的资源请求,而该资源被已被其他进程占用,此时请求阻塞,但又对自己已获取的其他自己保持不妨
不剥夺条件:进程已获取资源,在为使用完之前,不能被剥夺。
环路等待条件:存在进程循环链,等待和请求进行循环。 - 线程安全与内存模型的关系:
Java所有变量存储于主内存中,线程有工作内存,保存着线程所需变量的主内存副本拷贝,读取赋值都是在工作内存进行。
线程在计算数据的时候,频繁的数据操作一般存在寄存器和高速缓存,这些数据要在适当的时候应该写回内存。
由于线程之间数据不可见,而读取数据时都是从主存中复制,所以产生的线程不安全的问题,即高速缓存于主内存的同步问题。
线程安全围绕原子性(不被打断。基本类型数据访问属于原子行为,A+=B不具有。),有序性(执行顺序),可见性(数据可见性,Volatile) - 死锁如何排除
(1)撤消陷于死锁的全部进程;
(2)逐个撤消陷于死锁的进程,直到死锁不存在;
(3)从陷于死锁的进程中逐个强迫放弃所占用的资源,直至死锁消失。
(4)从另外一些进程那里强行剥夺足够数量的资源分配给死锁进程,以解除死锁状态。