java中的各种锁

公平锁: 是指多个线程获取锁时, 按照申请锁的顺序来获取锁

非公平锁: 多个线程获取锁时并不是按照顺序来获取, 有可能后申请的线程会直接尝试获取锁, 这一定程度上会优化性能, 但可能会造成优先级翻转和饥饿现象

可重入锁: 外层函数获得锁后, 内层函数仍能获取锁; 也就是说同一个线程在外层函数获取锁的时候, 进入内层函数会自动获取锁

自旋锁: 尝试获取锁失败的线程不会立即进入阻塞, 而是会采用循环的方式不对尝试获取锁, 好处是减少了上下文切换的消耗, 缺点是循环会消耗cpu

读写锁: 允许多个线程同时读一个资源, 但如果有一个线程在写一个资源, 则不允许其他线程对这个资源进行读或写操作

乐观锁: 认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。乐观锁在Java中是通过使用无锁编程来实现,最常采用的是CAS算法

悲观锁: 认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。

偏向锁: 偏向锁是指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁,降低获取锁的代价。

轻量级锁: 是指当锁是偏向锁的时候,被另外的线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,从而提高性能。

重量级锁: 若当前只有一个等待线程,则该线程通过自旋进行等待。但是当自旋超过一定的次数,或者一个线程在持有锁,一个在自旋,又有第三个来访时,轻量级锁升级为重量级锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值