多线程为什么要加锁
加锁是为了保护共享资源
。比如全局变量等共享资源,可以被所有线程修改。
如果不加锁,第一个线程读取数据时,第二个线程也在修改该数据,导致冲突。
线程锁啥时候用
锁一般在多线程编程中使用,用于临界资源的保护
,比如一个线程在修改一个全局变量、或在使用某外设(如打印机)时,禁止其它线程访问该变量或外设。
线程条件和锁是什么关系
条件需要和互斥锁配合使用,条件强调的是等待而不是互斥,条件锁会阻塞当前线程,直到某个条件成立时才会继续向下执行。
死锁
指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。若没有外力作用,他们都将无法推进。
死锁的四个必备条件
死锁的四个必要条件。这四个条件缺一不可,或者说只要破坏了其中任何一个条件,死锁就不可能发生。
1、互斥
(Mutual exclusion):存在这样一种资源,它在某个时刻只能被分配给一个执行绪(也称为线程)使用;
2、持有
(Hold and wait):当请求的资源已被占用从而导致执行绪阻塞时,资源占用者不但无需释放该资源,而且还可以继续请求更多资源;
3、不可剥夺
(No preemption):执行绪获得到的互斥资源不可被强行剥夺,换句话说,只有资源占用者自己才能释放资源;
4、环形等待
(Circular wait):若干执行绪以不同的次序获取互斥资源,从而形成环形等待的局面,想象在由多个执行绪组成的环形链中,每个执行绪都在等待下一个执行绪释放它持有的资源。
解除死锁的必要条件
不难看出,在死锁的四个必要条件中,第2、3、4项条件比较容易消除。通过引入事务机制,往往可以消除第2、3两项条件,方法是将所有上锁操作均作为事务对待
,一旦开始上锁,即确保全部操作均可回退,同时通过锁管理器检测死锁,并剥夺资源(回退事务)。这种做法有时会造成较大开销,而且也需要对上锁模式进行较多改动。
消除第4项条件是比较容易且代价较低的办法。具体来说这种方法约定:上锁的顺序必须一致。具体来说,我们认为地给锁指定一种类似“水位”的方向性属性。无论已持有任何锁,该执行绪所有的上锁操作,必须按照一致的先后顺序从低到高(或从高到低)进行,且在一个系统中
,只允许使用一种先后次序
。