并发编程---显示锁Lock

lock (显示锁)

Lock是一个接口,提供了无条件的、可轮询的、定时的、可中断的锁获取操作,所有的加锁和解锁操作方法都是显示的,因而称为显示锁。

Lock接口和核心方法

lock,unlock,trylock

Lock 使用的标准范式
package com.jym.concurrent.lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class LockDemo {

    private Lock lock = new ReentrantLock();
    private int count;

    public void increment () {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }

    public synchronized void increment2() {
        count++;
        increment2();
    }

    public synchronized void test() {
        increment2();
    }

}

Lock接口和synchronized的比较
  1. synchronized代码更简洁。
  2. Lock,效率比隐士锁更高
  3. Lock可以在获取锁可以被中断,超时获取锁,尝试获取锁。
Lock 接口的实现类
  1. ReentrantLock
  2. ReentrantReadWriteLock类中的两个静态内部类 ReadLock 和 WriteLock。
读写锁(ReentrantReadWriteLock):

同一时刻允许多个读线程同时访问,但是写线程访问的时候,所有的读和写都被阻塞,最适宜与读多写少的情况。

用于读多写少。ReadLock 读锁(共享锁),WriteLock 写锁(排他锁)

线程进入读锁的前提条件:

  • 没有其他线程的写锁。
  • 没有写请求或者有写请求,但调用线程和持有锁的线程是同一个。

线程进入写锁的前提条件:

  • 没有其他线程的读锁
  • 没有其他线程的写锁

锁降级
遵循获取写锁、获取读锁再释放写锁的次序,写锁能够降级成为读锁。

公平锁与非公平锁

公平锁:按照线程等待的顺序来获取锁。
非公平锁:随机获得锁。ReentrantLock 默认为非公平锁。

效率上:非公平 > 公平

重入锁:

在锁中继续获得锁,比如递归调用了上锁的方法。

Condition接口

用Lock和Condition实现等待通知
await : 阻塞获取锁的线程。
signal:唤醒阻塞的线程。

你可能感兴趣的:(多线程)