Java中的锁有哪些?

Java中的锁有哪些?,第1张

1、悲观锁和乐观锁

悲观锁:当前线程去 *** 作数据的时候,总是认为别的线程会去修改数据,所以每次 *** 作数据的时候都会上锁,别的线程去 *** 作数据的时候就会阻塞,比如synchronized;

乐观锁:当前线程每次去 *** 作数据的时候都认为别人不会修改,更新的时候会判断别人是否会去更新数据,通过版本来判断,如果数据被修改了就拒绝更新,例如cas是乐观锁,但是严格来说并不是锁,通过原子性来保证数据的同步,例如数据库的乐观锁,通过版本控制来实现,cas不会保证线程同步,乐观的认为在数据更新期间没有其他线程影响

总结:悲观锁适合写 *** 作多的场景,乐观锁适合读 *** 作多的场景,乐观锁的吞吐量会比悲观锁高

2、公平锁和非公平锁

公平锁:有多个线程按照申请锁的顺序来获取锁,就是说,如果一个线程组里面,能够保证每个线程都能拿到锁,例如:ReentrantLock(使用的同步队列FIFO)

非公平锁:获取锁的方式是随机的,保证不了每个线程都能拿到锁,会存在有的线程饿死,一直拿不到锁,例如:synchronized,ReentrantLock

总结:非公平锁性能高于公平锁,更能重复利用CPU的时间

3、可重入锁和不可重入锁

可重入锁:也叫递归锁,在外层使用锁之后,在内层仍然可以使用,并且不会产生死锁

不可重入锁:在当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞

总结

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/794234.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存