Java中的锁
什么是锁:
将某种资源私有化的物品;Java里面的锁也有这种特性;他可以让某个方法,某个变量或者某个通道在某个时刻下只能被一个线程占用;只有当这个锁被释放了,另外的线程才能使用;
临界区
多线程访问共享资源;防止出现数据不一致情况;引入了临界区;临界区是一个用来访问共享资源的代码块,同一时间只能一个线程进行访问;
有几种锁?
synchronized 非公平锁 :效率比较低,不够灵活,不可中断,无法感知获取锁
ReentrantLock 重入锁(公平,非公平锁):效率较高,灵活,可感知获取锁,可公平可非公平,可中断
ReadWriteLock 非公平锁 :读写分离控制(读多写少),读读并行,读写串行,写写串行
什么是死锁:
死锁是指两个或者两个以上进程在执行过程中;由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力的作用下;他们都无法推进下去;此时称系统状态处于死锁状态;这些永远相互等待的进程称为死锁进程;
死锁的原因:
系统资源不足;
程序执行顺序有问题;
程序资源分配不当;
死锁的四个必要条件:
互斥条件;一个资源只能被一个进程使用;
请求与保持条件;一个进程因请求资源而阻塞时,对已获得的资源保持不放;
不剥夺条件;进程已获得的资源,在未使用完之前,不能强行剥夺;
循环等待条件;若干进程之间形成一条头尾相接的循环等待资源关系;
如何解决死锁:
了解了死锁的四个必然条件,就可以最大化的避免、预防、解除死锁。
在系统设计,进程调度等方面注意如何不让这四个条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源;也要防止进程处于等待状态的情况下占用资源。因此,需要对资源进行合理的分配;
数据库中的锁
数据库死锁
而死锁发生在多个进程访问同一数据库时,其中每个进程所用的锁是其它进程所需的,由此造成每个进程无法继续下去;
简单地说就是:进程A等待进程B释放她的锁;进程B等待进程A释放她的锁;相互等待,就形成了死锁;
降低死锁:
同一顺序访问对象;
避免事务中用户交互;
保持事务简短并在一个批处理中;
使用低隔离级别;
使用绑定连接;