哈哈哈,刚一朋友问我java锁里面有啥,想了一下,不知道怎么表达呀,太多了,在这里总结一下
所谓多种锁,都是相对而言的,不同的锁都是通过不同维度来说明的
悲观锁-乐观锁:
这是两种不同的思想,悲观锁认为有并发就玩完,数据会不一致。乐观锁认为有并发没问题,检查一下就行了。基于这个思想,出现了不同的实现,synchronized就是这么认为的,有线程进来,其他线程就不要进来了。ReentrantLock则会让线程去尝试。不过synchronized 本身给对象加锁的时候确使用了乐观锁思想(cas)
互斥锁、读写锁(共享锁):
互斥锁指我在用这个对象的时候你不能对他进行任何操作,看一眼也不行。读写锁就开放多了,我写的时候你不可以读,但没写的时候,多少个线程来读都没有关系。synchronized就是互斥锁,Lock下面的ReadWriteLock就是读写锁。
公平锁、非公平锁:锁的两种竞争策略。公平锁指每个线程获取对象有先后顺序,按进入先后进入排队,基于AQS接口,比如reentrantLock。非公平锁则像synchronized,靠本事竞争。
偏向锁、轻量级锁、重量级锁:这几个是java对象头的几个属性,其实除了这些还有是否GC(CMS算法时标记),偏向锁指我这个对象更加爱哪个线程,就像一大群相亲对象让中意的先上一样。轻量级锁指利用CAS机制不停的自旋达到想要的效果,比如synchronzied修饰静态代码块。重量级锁则声明一个变量说已经被锁住了,当然也是在自旋成功以后,synchronized修饰方法时就是如此。
信号量锁:这个简单,读写锁里面允许多个线程同时读,但为了系统负荷等需求,只允许N个线程同时读,这就是信号量
分段锁:这个是jdk1.7的ConcurrentHashMap提出的理念,就是不同的数据段采取不同的锁
自旋锁:就是CAS(aba问题)