JAVA锁和分布式锁

Java锁

	java作为一门历史悠久的语言,肯定是支持并发安全的,也就是常说的锁。Java的锁总体来说分为以下三类,Synchronize锁,Reentrantlock相关锁和CAS相关锁。

Synchronize

Synchronize出现的比较早,相对来说比较笨重。不过后来进行了优化,使得其性能和可重入锁相差无几。
Synchronize解决什么问题?
Synchronize作为一个关键字,用来保证其修饰的代码区域的原子性,当然他也包含可见性和有序性。讲到这里要插一句,线程安全分为可见性,有序性和原子性。常见的volatile保证程序的有序性和可见性,但是不保证原子性。
ps:为什么Synchronize保证有序性,但是双检锁却要加上volatile,这是因为两个锁对与有序性的保证是不同的,synchronize并不是通过禁止指令重排来保证的,而是通过保证原子性来保证的有序性。这个可以参考双检锁。
public class Singleton {
	private Singleton(){}
	private  volatile  static Singleton instance;
	public static getInstance() {
		if(instance == null) {
			synchronize(this.class) {
				if(instance == null) 
					instance = new Singleton();
			}
		}
		return instance;
	}
}
Synchronze是如何实现原子性的
	实际上所有的悲观锁,都是使用互斥量来保证的,对于Synchronize来说,当线程访问到synchronize修饰的部分时,找到synchronize绑定的变量对应的一个monitor,然后通过monitor来使自己成为这个monitor的owner,如果已经有了owner,就让自己进入等待队列。当然还有一个wait队列,这是缺少运行条件是才用到的。它是不公平的。
Synchronize做了哪些优化?
	1.轻量级锁
	2.偏向锁
	3.自旋优化
	4.锁消除
	5.锁粗化

Reentrantlock相关锁

Reentrantlock也就是可重入锁,那么Synchronize也可以重入,为什么还需要Reentrantlock呢?
为什么需要Reentrantlock
1.从使用方法上来说,Reenreantlock是对象的形式,而Synchronize是关键字形式,所以Reentrantlock使用更加方便。
2.从底层实现上来说,Reentranlock是使用同步器内部类去实现锁的,而Synchronize是操作系统帮助实现的,性能比较差,不过后来有优化过性能,两者的性能差别不大。
3.从条件上来说,Reentranlock通过它的newcondition获取多个条件,Synchronize只有一个条件。
4.Reentrantlock可打断,支持公平锁,可以说比synchronize更加全面,但是使用也更复杂一些。
什么是AQS
AQS是JAVA中的一个类,名为AbstractQueuedSynchronize,作者是大名鼎鼎的大哥李。下一篇文章将详细介绍AQS。

CAS锁及其应用

什么CAS
谈到cas,就不得不提乐观锁。所谓乐观锁,就是乐观的认为数据不会改变,在访问数据时不加锁,而校验数据的

分布式锁

你可能感兴趣的:(java)