当一个线程在获取锁的时候,如果锁已经被其他线程获取,那么该线程将循环等待,然后不断的判断是否可以成功获取锁,直到获取到锁才会退出循环。通过CAS(compare and swap)算法会用到自旋锁
JDK1.6对自旋锁进行了改进,引入了自适应自旋锁,随着程序的运行和性能的监控,JVM会对锁的情况进行预测,从而给出适合的自旋时间,更加智能。
也可以称为互斥锁,就是同时只能有一个线程获取到锁
常用的synchronized,ReentrantLock是独占锁 ReadWriteLock中的写锁是独占锁。
具有独占锁功能的子类使用AQS,必须实现tryAcquire、tryRelease等方法。
可以有多个线程同时获取锁
常用的Semaphore(信号量) CountDownLatch都是共享锁
具有共享锁功能的子类使用AQS,必须实现tryAcquireShared、tryReleaseShared等方法 带有shared后缀的方法是支持共享锁加锁的语义