Java中的锁

什么是锁

  将某种资源私有化的物品;Java里面的锁也有这种特性;他可以让某个方法,某个变量或者某个通道在某个时刻下只能被一个线程占用;只有当这个锁被释放了,另外的线程才能使用;

 

临界区

  多线程访问共享资源;防止出现数据不一致情况;引入了临界区;临界区是一个用来访问共享资源的代码块,同一时间只能一个线程进行访问;

 

有几种锁?

  synchronized 非公平锁 :效率比较低,不够灵活,不可中断,无法感知获取锁

  ReentrantLock 重入锁(公平,非公平锁):效率较高,灵活,可感知获取锁,可公平可非公平,可中断

  ReadWriteLock 非公平锁 :读写分离控制(读多写少),读读并行,读写串行,写写串行

 

什么是死锁:

  死锁是指两个或者两个以上进程在执行过程中;由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力的作用下;他们都无法推进下去;此时称系统状态处于死锁状态;这些永远相互等待的进程称为死锁进程;

 

死锁的原因:

 

系统资源不足;

程序执行顺序有问题;

程序资源分配不当;

 

死锁的四个必要条件:

 

互斥条件;一个资源只能被一个进程使用;

请求与保持条件;一个进程因请求资源而阻塞时,对已获得的资源保持不放;

不剥夺条件;进程已获得的资源,在未使用完之前,不能强行剥夺;

循环等待条件;若干进程之间形成一条头尾相接的循环等待资源关系;

 

 

如何解决死锁:

  了解了死锁的四个必然条件,就可以最大化的避免、预防、解除死锁。

  在系统设计,进程调度等方面注意如何不让这四个条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源;也要防止进程处于等待状态的情况下占用资源。因此,需要对资源进行合理的分配;

 

 

数据库中的锁

数据库死锁

  数据库要修改一条数据时,会给他加上锁,保证数据的一致性;

  而死锁发生在多个进程访问同一数据库时,其中每个进程所用的锁是其它进程所需的,由此造成每个进程无法继续下去;

  简单地说就是:进程A等待进程B释放她的锁;进程B等待进程A释放她的锁;相互等待,就形成了死锁;

 

降低死锁

同一顺序访问对象;

避免事务中用户交互;

保持事务简短并在一个批处理中;

使用低隔离级别;

使用绑定连接;

 

 

posted @ 2020-10-04 17:53  小白不爱  阅读(118)  评论(0编辑  收藏  举报