亲宝软件园·资讯

展开

java lock锁使用

程序员皮卡秋 人气:0

Lock基本使用

Lock它是java.util.concurrent.locks下的一个接口,它也是用来处理线程同步问题的。

public interface Lock {
    void lock();
    void lockInterruptibly() throws InterruptedException;
    boolean tryLock();
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
    void unlock();
    Condition newCondition();
}

因为它只是接口,所以我们需要找到它的实现类,下面重点给大家介绍ReentrantLock,它也是我们工作中常用的

ReentrantLock

它是一种可重入互斥Lock ,其基本行为和语义与使用synchronized方法和语句访问的隐式监视器锁相同,但具有扩展功能。

说了这么多,还没带大家体验一把,下面我们就是来个例子试一下。

public class LockTest {
    private static Lock lock = new ReentrantLock();
    private static  int count = 0;
    private static void add() {
        try {
            //加锁
            lock.lock();
            count++;
            //重入锁
            reduce();
        } finally {
            // 记得释放锁
            lock.unlock();
            System.out.println(count);
        }
    }
    private static void reduce(){
        // 加锁
        lock.lock();
        count--;
        // 释放锁
        lock.unlock();
    }
    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 100; i++) {
            new Thread(LockTest::add).start();
        }
    }
}

我们发现无论执行多少次结果都是和预期的一样,都是0,我们再看下tryLock,直接改写reduce:

private static void reduce1(){
    if(lock.tryLock()) {
        try {
            count--;
        }finally {
            // 释放锁
            lock.unlock();
        }
    }else {
        System.out.println("no");
    }
}

通过上面的使用,我们来和Synchronized做一个对比。

结束语

本节主要讲了它的基本使用,大家可以举一反三,试试什么条件下会导致死锁。

加载全部内容

相关教程
猜你喜欢
用户评论