• 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】
  • 相关阅读:
    ECMAScript6 入门 函数的扩展
    ECMAScript6 入门-let与const命令
    编码规范
    webpack常用插件
    JS与CSS那些特别小的知识点区别
    常见数组方法及细节
    JS库
    Object冷知识
    html5-语义化标签
    Css继承属性和非继承属性
  • 原文地址:https://www.cnblogs.com/mature1021/p/10462195.html
Copyright © 2020-2023  润新知