1、可重入锁:
可重入锁也叫做递归锁,指同一个线程外层函数获得该锁之后,内层的递归函数仍可以获取该锁。就是线程可以同时获得一个锁多次,synchronized,ReentrantLock都是可重入锁。
2、自旋锁
如果持有锁的线程能在很短时间内释放锁资源,那么那些等待竞争的锁的线程就不需要做内核态和用户态之间的转换(线程私有内存,和共有内存),进入阻塞,挂起状态等。优点:
自旋锁可以减少CPU上下文的切换,对于占用锁的时间非常短或者锁竞争不激烈的代码块来说性能大幅度提升。缺点:线程在自旋过程中会长时间获取不到锁资源。引起CPU的浪费。
3、CAS 比较交换
CAS 比较交换算法,CAS(V,E,N) V 是现在内存中的值,E 是上一次取出的值,N是要更新的新值。实现原理是先获取E,然后在更新N的时候,用V和E对比,如果V和E相同就认为数据没有发生变化,可以更新,如果V和E不同了,那就说明其他线程对对值进行了修改,那么当前线程不做任何修改。
在jdk中有一个java.util.concurrent.atomic 里面提供了一组原子类就是使用CAS实现的。
4、ABA问题:
就是线程再获取E之后,而线程将V中的A改成了B,过段时间又将B改为了A,这种操作CAS算法是没法检测到的,这种可以添加一个版本号来解决。
5、AQS
AQS(Abstract Queued Synchronizer) 是一个虚拟的队列同步器,通过维护一个共享资源状态(Volatile int State) 和一个先进先出的队列实现多线程共享资源。
AQS 我觉得原理应该是:
共享资源有一个资源状态state ,一个线程来了会去判断state,通过判断state知道共享资源状态是否可以执行。如果当前状态可执行,就操作共享资源,如果资源状态是不可执行状态,就会调用wait() ,当前线程就会放弃CPU资源,Runnable对象就会进入同步队列,由先进先出的算法去出队列
java.util.concurrent 这个包里面包含并发编程的操作,包含各种锁,以及原子类。