ReentrantLock重入锁

Posted mature1021

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ReentrantLock重入锁相关的知识,希望对你有一定的参考价值。

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.locks.ReentrantLock;
/**
 * 可重入锁: 也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。
在JAVA中ReentrantLock 和synchronized 都是可重入锁;
重入锁ReentrantLock 相对来说是synchronized、Object.wait()和Object.notify()方法的替代品(或者说是增强版),在JDK5.0的早期版本,重入锁的性能远远好于synchronized,
但从JDK6.0开始,JDK在synchronized上做了大量的优化,使得两者的性能差距并不大。但ReentrantLock也有一些synchronized没法实现的特性。
ReentrantLock 在Java也是一个基础的锁,ReentrantLock 实现Lock接口提供一系列的基础函数,开发人员可以灵活的是应用函数满足各种复杂多变应用场景;
 * @author linxu
 *
 */
public class ReentrantLockDome {
    private static ReentrantLock reentrantLock = new ReentrantLock(true);
    /**
     * 为了明显直观的理解,我在这里将执行线程对像放进了队列,遵循先进先出的原则;
     */
    static ConcurrentLinkedQueue<Runnable> queue = new ConcurrentLinkedQueue<>();

    public static void main(String[] args) {
        // ExecutorService service = Executors.newFixedThreadPool(10);
        for (int i = 1; i < 10; i++) {
            final int j = i;
            queue.add(new Runnable() {// 按照顺序讲执行线程放到队列,
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    if (j % 2 == 1) {
                        remove(j);
                    } else {
                        add(j);
                    }
                }
            });
        }
        new Thread() {
            public void run() {
                while (true) {
                    if (!queue.isEmpty()) {// 从队列中取出执行线程,【遵循先进先出原则】
                        queue.poll().run();
                    }
                }
            }

        }.start();
    }
     /**
      * 模拟添加
      * @param count
      */
    public static void add(int count) {
        reentrantLock.lock();
        try {
            System.out.println(count + "=偶数;获取锁资源!执行增加!!!!" + "=======>【"
                    + new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date())+"】");
            Thread.sleep(3000);
        } catch (Exception e) {

        } finally {
            System.out.println(
                    count + ":释放锁资源" + "=======>【" + new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date())+"】");
            reentrantLock.unlock();
        }

    }
    /**
     * 模拟删除
     * @param count
     */
    public static void remove(int count) {
        reentrantLock.lock();
        try {
            System.out.println(count + "=奇数:获取锁资源!执行删除!!!!" + "=======>【"
                    + new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date())+"】");
            Thread.sleep(3000);

        } catch (Exception e) {
            // TODO: handle exception
        } finally {
            System.out.println(
                    count + "释放锁资源" + "=======>【" + new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date())+"】");
            reentrantLock.unlock();
        }

    }
}



结果:
1=奇数:获取锁资源!执行删除!!!!=======>【2019-59-02 17:59:09】
1释放锁资源=======>【2019-59-02 17:59:122=偶数;获取锁资源!执行增加!!!!=======>【2019-59-02 17:59:122:释放锁资源=======>【2019-59-02 17:59:153=奇数:获取锁资源!执行删除!!!!=======>【2019-59-02 17:59:15】
3释放锁资源=======>【2019-59-02 17:59:184=偶数;获取锁资源!执行增加!!!!=======>【2019-59-02 17:59:184:释放锁资源=======>【2019-59-02 17:59:215=奇数:获取锁资源!执行删除!!!!=======>【2019-59-02 17:59:21】
5释放锁资源=======>【2019-59-02 17:59:246=偶数;获取锁资源!执行增加!!!!=======>【2019-59-02 17:59:246:释放锁资源=======>【2019-59-02 17:59:277=奇数:获取锁资源!执行删除!!!!=======>【2019-59-02 17:59:27】
7释放锁资源=======>【2019-59-02 17:59:308=偶数;获取锁资源!执行增加!!!!=======>【2019-59-02 17:59:308:释放锁资源=======>【2019-59-02 17:59:339=奇数:获取锁资源!执行删除!!!!=======>【2019-59-02 17:59:33】
9释放锁资源=======>【2019-59-02 17:59:36】

 

以上是关于ReentrantLock重入锁的主要内容,如果未能解决你的问题,请参考以下文章

ReentrantLock重入锁

十ReentrantLock重入锁

ReentrantLock可重入锁在我们的代码中。

[图解Java]ReentrantLock重入锁

B9 Concurrent 重入锁(ReentrantLock)

ReentrantLock 重入锁(下)