并发编程

锁-Lock-04

2019-08-17  本文已影响0人  愤怒的奶牛

可重入锁
广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁。ReentrantLock和synchronized都是可重入锁

/**
 * 重入锁
 */
public class ReLock {

    //锁的范围一样 this
    public synchronized void add() {
        System.out.println("add = "+ Thread.currentThread().getName());
        sub();
    }

    // this
    public synchronized void sub() {
        System.out.println("sub = " + Thread.currentThread().getName());
    }

    public static void main(String[] args) {
        ReLock reLock = new ReLock();
        reLock.add();
    }

输出:

"
add = main
sub = main

Process finished with exit code 0
//可重入锁
    Lock lock = new ReentrantLock();
    public void addTest() {
        lock.lock();//加锁
        System.out.println("addTest = "+ Thread.currentThread().getName());
        lock.unlock();//释放锁
    }
public class RwLock {

    private Map<String,String> cacheMap = new HashMap<>();

    // 读写锁
    private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();

    //读锁
    private final Lock readLock = readWriteLock.readLock();
    //写锁
    private final Lock writeLock = readWriteLock.writeLock();


    public String get(String key) {
        try{
            readLock.lock();//加锁,如果此时有写操作 ,当前读取数据的线程将会被阻塞
            return cacheMap.get(key);
        }finally {
            readLock.unlock();//释放锁
        }
    }

    public void set(String key, String value) {
        try{
            writeLock.lock();//写锁
            cacheMap.put(key, value);
        }finally {
            writeLock.unlock();//释放锁
        }
    }

公平锁和非公平锁:
在java的锁机制中,公平和非公平的参考物是什么,个人而言觉得是相对产生的结果而立,简单的来说,如果一个线程组里,能保证每个线程都能拿到锁,那么这个锁就是公平锁。相反,如果保证不了每个线程都能拿到锁,也就是存在有线程饿死,那么这个锁就是非公平锁

优缺点:
非公平锁性能高于公平锁性能。首先,在恢复一个被挂起的线程与该线程真正运行之间存在着严重的延迟。而且,非公平锁能更充分的利用cpu的时间片,尽量的减少cpu空闲的状态时间。
使用场景
使用场景的话呢,其实还是和他们的属性一一相关,举个栗子:如果业务中线程占用(处理)时间要远长于线程等待,那用非公平锁其实效率并不明显,但是用公平锁会给业务增强很多的可控制性。

上一篇 下一篇

猜你喜欢

热点阅读