java 相关锁

double

记录一下

1. 悲观锁与乐观锁

悲观锁:
它也叫(独占锁、排它锁、互斥锁)?,它假设一定会发生冲突,因此获取到锁之后会阻塞其他等待线程,这么做的好处是简单安全,但是挂起线程和恢复线程都需要转入内核状态进行,这样做会带来很大的性能开销。悲观锁的代表是 synchronized

乐观锁:
它假设不会产生冲突,先去尝试执行某项操作,失败了在进行其他处理(一般都是不断循环重试)。这种锁不会阻塞其他的线程,也不涉及上下文切换,性能开销小,代表实现是 CAS。

2. 公平锁与非公平锁

公平锁
各个线程在加锁前先检查有无排队的线程,按排队顺序去获得锁。

非公平锁
非公平锁是指线程加锁前不考虑排队问题,直接尝试获取锁,获取不到再去队尾排队,指的注意的是,在AQS的实现中,一旦线程加入排队队列,即使是非公平锁,线程也得乖乖排队。
Java多线程 – 公平锁和非公平锁的一些思考

3. 可重入锁和不可重入锁

如果一个线程已经获取到了一个锁,那么它可以访问被这个锁锁住的所有代码块,不可重入锁与之相反。

4. 自旋锁与自适应自旋

互斥同步对性能的最大影响是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成。

自旋锁
在许多应用中,锁定状态只会持续很短的时间,为了这么一点时间去挂起恢复线程,不值得。我们可以让原本需要等待的线程执行一个忙循环(自旋),在循环中获得锁。说白了就是让它 “原地踏步”,自己发会呆,这就是所谓的自旋锁。它虽然节省系统切换线程的消耗,但仍然要占用处理器。查看【互斥锁,自旋锁与自适应自旋锁】

自适应自旋
在 JDK 1.6 又引入了自适应的自旋锁,不在通过次数来限制,而是由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定。

分布式锁

浅谈分布式锁

独占锁(写锁) 和 共享锁(读锁)

独占锁: 指该锁一次只能被一个线程所持有,对于 ReentrantLock和Synchronized而言都是独占锁
共享锁: 指该锁可以被多个线程锁持有

分离锁

Java并发之AQS源码分析(一)

CAS

???

自旋锁与自适应自旋锁

自旋锁: 在许多情况下,共享数据的锁定状态持续时间较短,切换线程不值得,可以通过让线程执行忙循环等待锁的释放,不让出CPU。但是该锁缺点就是若锁被其他线程长时间占用会带来许多性能上的开销。

自适应自旋锁: 自旋的次数不在固定,由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定。

互斥锁

特点:

  • 互斥性: 即在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程的协调机制,这样在同一时间只有一个线程对需要同步代码块(复合操作)进行访问。互斥性也称为操作的原子性。
  • 可见性: 必须确保在锁被释放之前,对共享变量所做的修改,对于随后获得该锁的另一个线程是可见的(即在获得锁时应获得最新共享变量的值),否则另一个线程可能是在本地缓存的某个副本上继续操作,从而引起不一致。