1. 公平锁非公平锁
比较
非公平锁比公平锁性能高5-10倍,因为公平锁需要在多核情况下维护一个队列,如果当前线程不是队列的第一个无法获取锁,增加了线程切换次数。
应用
在Java中ReentrantLock,ReentrantReadWriteLock和Semaphore可设置成公平锁。
2. 可重入锁
ReentrantLock,ReentrantReadWriteLock,synchronized
不可重入锁:同一个线程在外层方法获取锁的时候,在进入内层方法会阻塞,直到外层方法释放锁。
class Phone{
public synchronized void sendMes()throws Exception{
System.out.println(Thread.currentThread().getId()+"\t invoked sendMes()");
//外层sync
sendEmail();//内层sync,内层可直接获得
//t1
}
public synchronized void sendEmail()throws Exception{
System.out.println(Thread.currentThread().getId()+"\t ############invoked sendEmail()");
}
}
public class ReenterLockDemo {
public static void main(String[] args) {
Phone p1=new Phone();
new Thread(()->{
try {
p1.sendMes();
}catch (Exception e){
e.printStackTrace();
}
},"t1").start();
new Thread(()->{
try {
p1.sendMes();
}catch (Exception e){
e.printStackTrace();
}
},"t2").start();
}
}
结果
13 invoked sendMes()
13 ############invoked sendEmail()
14 invoked sendMes()
14 ############invoked sendEmail()
3.自旋锁
4.乐观锁 悲观锁
乐观锁在Java中的使用,是无锁编程,常常采用的是CAS算法,典型的例子就是原子类,通过CAS自旋实现原子操作的更新。
重量级锁是悲观锁的一种,自旋锁、轻量级锁与偏向锁属于乐观锁