乐观锁&悲观锁
一般的锁都可以分为了乐观锁或者悲观锁,悲观锁是指先把数据锁定了再去读写操作,而乐观锁是指在更新到数据时才去判断数据是否被他人使用。
悲观锁具体的实现就是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日