java锁的分类(简单概括版)

乐观锁&悲观锁

一般的锁都可以分为了乐观锁或者悲观锁,悲观锁是指先把数据锁定了再去读写操作,而乐观锁是指在更新到数据时才去判断数据是否被他人使用。
悲观锁具体的实现就是java中的各种锁
乐观锁的实现时依靠无锁编程,常使用cas自旋算法。算法涉及到三个值,初始值、修改的值、当前的值。当程序要修改某个值时,先判断当前值是否等于初始值,如果等于则直接赋值修改的值,不等于则自旋等待,缺点占用cpu,具体实现例子请看大神的文章JAVA乐观锁实现-CAS

互斥锁(独占锁)&读写锁(分享锁)

互斥锁只能有唯一一个线程占有,而读写锁可以被多个线程同时占有,但是一个对象有了读写锁之后就不能再加互斥锁了
互斥锁具体实现:Lock、Synchronized
读写锁具体实现:ReadWriterLock

公平锁&非公平锁

是否按照申请的顺序来公平分配锁,非公平锁可以减少线程睡眠和唤醒次数,加快效率
公平锁具体实现:Lock和ReadWriterLock参数为true时
非公平锁具体实现:Lock和ReadWriterLock无参数或为false时、synchronized

可重入锁&不可重入锁

当前线程的某个方法获取锁后,在另一个方法中是否需要再次获取,需要则为不可重入。
可重入锁具体实现方法:ReentrantLock、ReentrantReadWriterLock、sysnchronized
不可重入锁:Lock、ReadWriterLock、

偏向锁&轻量级锁&重量级锁

特指sysnchronized所处的状态,随着竞争情况不断的升级,不会出现降级,这四种状态是对sysnchronized性能的优化
1.偏向锁状态,指默认会被第一个访问锁的进程不断持有,若一直没有其他线程竞争,则会一直持有,当出现竞争时这升级为轻量级锁,适用于单线程的状况
2.轻量级锁状态,当线程竞争同一个锁时,竞争线程不会阻塞,而是会自旋等待锁的释放,适用于线程交替获取锁的情况,当同一时间有多个线程多次申请时,此时会升级为重量级锁
3.重量级锁,效果等同于Lock等,java最常见的锁,不解释

个人边学习边编写文章,欢迎交流错误或疑问2018年12月21日

参考文献

Java中的锁分类
Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值