锁-概念:可重入锁、可中断锁、公平锁、读写锁

可重入锁

指的是在同一个thread中,获取锁之后再次使用同样的方法或对象中的其他方法可以直接操作,而不需要重新获取锁。它是基于thread粒度的,per-thread。

不可重入锁

指的是每次使用锁方法时,都需要重新获取锁,即使在同一线程中调用同一方法都需要等待上一个锁的释放。它是基于method粒度的,per-invocation。
可重入锁与不可重复锁的例子

//设计一个锁
public class Lock{
    private boolean isLocked = false;
    public synchronized void lock() throws InterruptedException{
        while(isLocked){    
            wait();
        }
        isLocked = true;
    }
    public synchronized void unlock(){
        isLocked = false;
        notify();
    }
}

// 不可重入锁
public class Count{
    Lock lock = new Lock();
    public void print(){
        lock.lock();
        doAdd();
        lock.unlock();
    }
    public void doAdd(){
        lock.lock();
        //do something
        lock.unlock();
    }
}

以上就是一个不可重入锁。同一线程多次调用print()方法或则doAdd()方法都会阻塞。

// 可重入锁
public class Lock{
    boolean isLocked = false;
    Thread  lockedBy = null;
    int lockedCount = 0;
    public synchronized void lock()
            throws InterruptedException{
        Thread thread = Thread.currentThread();
        while(isLocked && lockedBy != thread){
            wait();
        }
        isLocked = true;
        lockedCount++;
        lockedBy = thread;
    }
    public synchronized void unlock(){
        if(Thread.currentThread() == this.lockedBy){
            lockedCount--;
            if(lockedCount == 0){
                isLocked = false;
                notify();
            }
        }
    }
}

以上就是一个可重入锁。只要是同一个thread获取对应的锁之后就可以重复的调用对应的方法,而不需要再次获取锁。

可中断锁

在等待获取锁过程中可中断。注意是在等待锁过程中才可以中断,如果已经获取了锁,中断就无效。

公平锁

按等待获取锁的线程的等待时间进行获取,等待时间长的具有优先获取锁权利。即按先后顺序来持有锁。

读写锁

对资源读取和写入的时候拆分为2部分处理,读的时候可以多线程一起读,写的时候必须同步地写。如:ReentrantReadWriteLock.

猜你喜欢

转载自blog.51cto.com/881206524/2132462