java 获取时间戳_说一说Java中锁 - 京东面试题

锁的面试题在大厂中经常除实现,小伙伴们也经常蒙圈。因为Java中的各种锁太多了,很容易把自己绕晕。今天我们就理一理Java中的各种锁。

什么是锁

锁是用来控制多个线程访问共享资源的方式,一般来说,锁能够防止多个线程同时访问共享资源。

锁的分类

大家先看这张图,对锁进行了分类。

cfb0b853ec3e208c2204dd8bd05fea9b.png

乐观锁和悲观锁

悲观锁

总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。

乐观锁

总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。

基本思路是在数据上增加一个version字段或者timestamp时间戳。先获取包括时间戳的数据,在更新时候,对版本号进行比较,如果版本号被其他线程更新了,则更新失败;如果没有,则更新数据,同时对版本号进行增加。

SVN、GIT的思路也是属于乐观锁。程序员各自编辑代码,在提交时候才检查是否冲突。

ORM框架Hibernate中也是可以支持实现乐观锁。原理也是通过在表中增加version或者timestamp的方式。

可重入锁和非可重入锁

重入锁ReentrantLock,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对

资源的重复加锁。

回忆在同步器一节中的示例(Mutex),同时考虑如下场景:当一个线程调用Mutex的lock()

方法获取锁之后,如果再次调用lock()方法,则该线程将会被自己所阻塞,原因是Mutex在实现tryAcquire(int acquires)方法时没有考虑占有锁的线程再次获取锁的场景,而在调用

tryAcquire(int acquires)方法时返回了false,导致该线程被阻塞。简单地说,Mutex是一个不支持重进入的锁。而synchronized关键字隐式的支持重进入,比如一个synchronized修饰的递归方法,在方法执行时,执行线程在获取了锁之后仍能连续多次地获得该锁,而不像Mutex由于获取了锁,而在下一次获取锁时出现阻塞自己的情况。

ReentrantLock虽然没能像synchronized关键字一样支持隐式的重进入,但是在调用lock()方

法时,已经获取到锁的线程,能够再次调用lock()方法获取锁而不被阻塞。

公平锁和非公平锁

如果在绝对时间上,先对锁进行获取的请求一定先被满足,那么这个锁是公平的,反之,是不公平的。公平的获取锁,也就是等待时间最长的线程最优先获取锁,也可以说锁获取是顺序的。ReentrantLock提供了一个构造函数,能够控制锁是否是公平的。

事实上,公平的锁机制往往没有非公平的效率高,但是,并不是任何场景都是以TPS作为唯一的指标,公平锁能够减少“饥饿”发生的概率,等待越久的请求越是能够得到优先满足。

共享锁和排它锁

排他锁,又称为独占锁、独享锁。

共享锁,又称为读锁,获得共享锁之后,可以查看但无法修改和删除数据,其他线程此时也可以获取到共享锁,也可以查看但无法修改和删除数据。

ReentrantLock、synchronized都属于排它锁。

而读写锁ReentrantReadWriteLock兼具共享锁和排它锁,其中读锁是共享锁,写锁是独享锁。

自旋锁和堵塞锁

自旋锁

采用让当前线程不停的在循环体内执行实现,当循环的条件被其它线程改变时才能进入临界区。

由于自旋锁只是将当前线程不停地执行循环体,不进行线程状态的改变,所以响应速度更快。但当线程数不停增加时,性能下降明显,因为每个线程都需要执行,占用CPU时间。如果线程竞争不激烈,并且保持锁的时间段。适合使用自旋锁。

阻塞锁

阻塞锁改变了线程的运行状态,让线程进入阻塞状态进行等待,当获得相应的信号(唤醒或者时间)时,才可以进入线程的准备就绪状态,转为就绪状态的所有线程,通过竞争,进入运行状态。

阻塞锁的优势在于,阻塞的线程不会占用cpu时间,不会导致 CPu占用率过高,但进入时间以及恢复时间都要比自旋锁略慢。在竞争激烈的情况下 阻塞锁的性能要明显高于自旋锁。

可中断锁

根据锁在申请过程中是否会响应interrupt方法的中断请求。可以分为可中断锁和非可中断锁。

tryLog(time,timeunti)、lockInterruptibl()获取的都是可中断锁。

lock()方法、synchronized则不是可中断锁。

54591d514688e3a565ffc9f5517ab981.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
province:北京 --cityName:朝阳区 ----countyName:三环以内 ----countyName:三环到四环之间 ----countyName:四环到五环之间 ----countyName:五环到六环之间 ----countyName:管庄 ----countyName:北苑 ----countyName:定福庄 --cityName:海淀区 ----countyName:三环以内 ----countyName:三环到四环之间 ----countyName:四环到五环之间 ----countyName:五环到六环之间 ----countyName:六环以外 ----countyName:上地 ----countyName:西三旗 ----countyName:清河 ----countyName:圆明园西路 ----countyName:农业大学西校区 ----countyName:西二旗 --cityName:西城区 ----countyName:内环到二环里 ----countyName:二环到三环 --cityName:东城区 ----countyName:内环到三环里 --cityName:崇文区 ----countyName:一环到二环 ----countyName:二环到三环 --cityName:宣武区 ----countyName:内环到三环里 --cityName:丰台区 ----countyName:四环到五环之间 ----countyName:二环到三环 ----countyName:三环到四环之间 ----countyName:五环到六环之间 ----countyName:六环之外 --cityName:石景山区 ----countyName:四环到五环内 ----countyName:石景山城区 ----countyName:八大处科技园区 --cityName:门头沟 ----countyName:郊区 ----countyName:城区以内 --cityName:房山区 ----countyName:郊区 ----countyName:城区以内 --cityName:通州区 ----countyName:五环到六环之间 ----countyName:六环以外(其他地区) ----countyName:六环以外(张家湾镇、台湖镇、漷县镇、宋庄镇) ----countyName:六环以外(于家务乡) --cityName:大兴区 ----countyName:四环至五环之间 ----countyName:六环以外 ----countyName:五环至六环之间 ----countyName:北京经济技术开发区 --cityName:顺义区 ----countyName:顺义区(城区内,天竺镇,马坡镇,牛栏山镇,后沙峪镇城区) ----countyName:顺义区(郊区) ----countyName:顺义区(南彩镇、李桥镇) --cityName:怀柔区 ----countyName:郊区 ----countyName:城区以内 --cityName:密云区 ----countyName:城区以外 ----countyName:城区 --cityName:昌平区 ----countyName:城区以外 ----countyName:六环以内 ----countyName:城区 --cityName:平谷区 ----countyName:城区以外 ----countyName:城区 --cityName:延庆县 ----countyName:百泉路南,京新高速北,康张路西,京银路东 ----countyName:百泉路北,京新高速南,康张路东,京银路西 province:上海 里面还包含:jsonUtils工具类,Nettool工具类

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值