首页 南方天气预报正文

武汉地铁4号线,Java中常见的几种锁-雷火app

admin 南方天气预报 2019-11-17 300 0

一提起锁,java里或许大部分初学者想到的或许便是synchronized了。

其实咱们在实践编码中会用到许多中的锁,比方达观锁与失望锁、公正锁与非公正锁、独占锁与同享锁等,本文先对这几种常用的锁的概念先做一个描绘,后续的文章在结合代码进行剖析它的原理。

达观锁与失望锁

此类锁本来是数据库里的概念,可是在java编码中咱们也会运用到,所以在这儿也详细的描绘一下。

失望锁,在更新数据的时分以为或许其他线程也在一起更新,所以在处理处理前先对数据进行加锁处理,确保该数据只能被一个线程更新。当线程成功获取锁之后,履行更新操作,终究提交事物开释锁。假如获取锁失利,则阐明有其他线程在处理,则该线程等候或抛出反常。

失望锁的完成一般是这样的

  1. select * from table where xx=xx for update
  2. update table set xx=xx where xx=xx

留意1和2需要在一个业务里。

达观锁,在数据更新的时分以为其他线程不会更新,不过一般在更新的时分会带着额定的条件,比方用版本号或许该记载的终究一次更新的时刻都能够。我在实践项目顶用的最多的依据时刻作为达观锁进行更新,在代码判别是否更新成功,假如更新失利,则经过重试来确保数据的终究一致性。

达观锁一般这样完成:

update table set xx=xx,gmt_modify=now() where xx=xx and gmt_modify = xxx

gmt_modify代表该条记载在终究一次更新时的时刻。

公正锁与非公正锁

依据线程获取锁的抢占机制来区分为公正锁和非公正锁。

公正锁是指依照线程恳求锁的时刻次序来决议的,恳求锁最早的那个线程会最早取得锁。非公正锁则是在运行时介入,也便是一个线程开释锁之后,其他线程会一起抢占,谁拿到锁谁就会获取CPU履行权。

在java中,ReentrantLock供给了公正锁和非公正锁的完成。

在运用new的时分能够履行运用哪种锁,这儿不再胪陈,后边的文章再剖析。

独占锁和同享锁

独占锁是在任何时分都只能有一个线程去拜访同享资源,ReentrantLock其实便是独占锁,它是一种失望锁,每次拜访(不管是读仍是写)都会加锁互斥,并发性不高,可是不会损坏数据的一致性。

与之对应的则是同享锁,它放宽了加锁的条件,答应多个线程一起进行读操作,写操作是互斥的来确保数据的一致性。

可重入锁

可重入锁是指一个线程现已获取到了锁,在履行代码时遇到了加锁操作,这个时分不需要再次获取锁而是能够履行履行。

java中synchronized其实便是可重入锁,它的完成原理是在锁内部保护一个线程的标明,用来记载当时锁被哪个线程占用,一起相关一个计数器(默以为0,用来标明是否被占用了)。当获取锁后,技能器+1,其他线程发现当时计数器不为0,阐明现已被其他线程占用了,那我就堵塞一会等等吧。假如一个线程获取锁后再次进行恳求锁时发现当时线程是自己,则计数器持续+1, 开释后-1, 知道技能器为0,告诉其他线程能够进行处理了。

自旋锁

咱们知道java中的线程和操作系统中的线程是一一对应的,所以一个线程获取锁失利后,会从用户态切换到内核态,然后挂起该线程。当该线程获取锁之后,又需要从内核态切换到用户态唤醒该线程。从用户态切换到内核态的开支是比较大的,必定程度影响并发度。所以也就有了自旋锁的规划,当线程还获取锁时,假如发现锁被其他线程占用,该线程在不抛弃cpu的情况下,多测验获取几回锁,假如获取不到,在进行挂起。这种规划其实是用cpu的履行时刻来交换线程堵塞与调度的开支,不过有或许会形成cpu的轮空,糟蹋cpu的时刻。

分布式锁

上面的锁其实都是单JVM内部的锁,可是在现在分布式开发环境下,这种锁其完成已不能满意咱们的需求了,所以就有了分布式锁。其实原理都是相同的,仅仅这块同享的资源,由单机环境改变为了杂乱的互联网环境。分布式锁的完成一般有用redis、zk和etcd的,详细完成不再胪陈,后续文章会写。

雷火电竞版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

最近发表

    雷火app_雷火竞技竞猜平台|首页

    http://www.film101studio.com/

    |

    Powered By

    使用手机软件扫描微信二维码

    关注我们可获取更多热点资讯

    雷火电竞出品