1 乐观锁:每次共享数据的时候认为别人不会修改, 只更新的时候去判断这期间有没有人去更新数据。数据库版本号和通过CAS算法实现的类。
2.悲观锁:假设每次拿数据的时候都会被其他人修改,在每次共享数据的时候加锁,使用完了再释放。Java中的synchronize重量级锁和数据库行锁。
3 volatile与synchronized区别:synchronized用于加锁,volatile只是保持变量的可见性,适用一个线程写,多个线程读的场景,只能保证线程可见性,不能保证原子性。volatile防止指令重排,在DCL(双重检查锁模式)中,防止高并发的情况下,指令重排造成的线程安全问题。 private volatile static Singleton singleton;
4.Java 中的说就是在对象的Markword中的记录一个锁状态。 无锁,偏向锁,轻量级锁(自旋锁 -> 自适应自旋锁 解决的是“锁竞争时间不确定”的问题),重量级锁对应不同的四个状态。
5.AQS(AbstractQueueSynchroizer): 是Java线程同步的框架,维护一个信号量state和一个线程组成的双向链表队列,用于给线程排队。state类似于红绿灯,控制线程排队或者放行。
6. 可重入锁:某个线程已经获得某个锁,可以再次获取锁而不会出现死锁。通过信号量实现。例如:synchronized ReentrantLock