1、自旋锁:
采用让当前线程不停的在循环体内执行实现,当循环的条件被其它线程改变时才能进入临界区
举例如下:
优缺点分析:
由于自旋锁只是将当前线程不停地执行循环体,不进行线程状态的改变,所以响应速度更快。但当线程数不停增加时,性能下降明显,因为每个线程都需要执行,占用CPU时间。如果线程竞争不激烈,并且保持锁的时间段。适合使用自旋锁。
2、阻塞锁:
阻塞锁改变了线程的运行状态,让线程进入阻塞状态进行等待,当获得相应的信号(唤醒或者时间)时,才可以进入线程的准备就绪状态,转呗就绪状态的所有线程,通过竞争,进入运行状态。
优缺点分析:
阻塞锁的优势在于,阻塞的线程不会占用cpu时间,不会导致 CPu占用率过高,但进入时间以及恢复时间都要比自
旋锁略慢。在竞争激烈的情况下 阻塞锁的性能要明显高于自旋锁。
3、重入锁:
Java中的synchronized同步块是可重入的。这意味着如果一个java线程进入了代码中的synchronized同步块,
并因此获得了该同步块使用的同步对象对应的管程上的锁,那么这个线程可以进入由同一个管程对象所同步的另
一个java代码块。
ReentrantLock与synchronized比较:
前者使用灵活,但是必须手动开启和释放锁
前者扩展性好,有时间锁等候(tryLock( )),可中断锁等候(lockInterruptibly( )),锁投票等,适合用于高度竞争锁和多个条件变量的地方
前者提供了可轮询的锁请求,可以尝试去获取锁(tryLock( )),如果失败,则会释放已经获得的锁。有完善的错误恢复机制,可以避免死锁的发生。
优缺点分析:
可重入锁的**优点就是可以避免死锁。缺点是必须手动开启和释放锁。