zoukankan      html  css  js  c++  java
  • 多线程(4)

    显示锁

      1定义:显示声明的锁,比如reentrantlock
    

    非显示锁sychronized

    公平锁,非公平锁

      1定义:这个是reentrantlock底层,默认为非公平锁,速度快
    

    读写锁

      1:reentrantlock的分为读写锁,口诀:读读共享,写写互斥,读写互斥
      2:应用场景:多读写少的场景
    

    阻塞与唤醒 Condition

      1:对于同一个lock,可以加上Condition进行等待唤醒控制
      2:比如生产者消费者问题:
    
    package cn.enjoyedu.ch4.rw;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    import java.util.function.Consumer;
    
    public class Test1 {
    
    
        private static Lock lock = new ReentrantLock();
        private static Condition notEmpty = lock.newCondition();
        private static Condition notFull = lock.newCondition();
        private static volatile  int count = 0;
        public static void main(String[] args) {
            ExecutorService pool = Executors.newFixedThreadPool(6);
            pool.execute(new Gun(lock, notEmpty, notFull));
            pool.execute(new Bullet(lock, notEmpty, notFull));
        }
    
        public static class Gun implements Runnable {
            private Lock lock;
            private Condition notEmpty;
            private Condition notFull;
    
            public Gun(Lock lock, Condition notEmpty, Condition notFull) {
                this.lock = lock;
                this.notEmpty = notEmpty;
                this.notFull = notFull;
            }
    
            public void run() {
                while (true) {
                    lock.lock();
                    while (count == 0) {
                        try {
                            notEmpty.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println("射击---biubiubiu");
                    count--;
                    notFull.signal();
                    lock.unlock();
                }
            }
        }
    
        public static class Bullet implements Runnable {
    
            private Lock lock;
            private Condition notEmpty;
            private Condition notFull;
    
            public Bullet(Lock lock, Condition notEmpty, Condition notFull) {
                this.lock = lock;
                this.notEmpty = notEmpty;
                this.notFull = notFull;
            }
    
            public void run() {
                while (true) {
                    lock.lock();
                    while (count >= 20) {
                        try {
                            notFull.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println("压入子弹---铛铛");
                    count++;
                    notEmpty.signal();
                    lock.unlock();
                }
            }
        }
    }
    
  • 相关阅读:
    P4568 [JLOI2011]飞行路线(分层图)
    打地鼠游戏(贪心)
    雷神领域(并查集真是个好东西)并查集+流氓dp
    P2934 [USACO09JAN]安全出行
    P2893 [USACO08FEB]修路
    P2894 [USACO08FEB]酒店Hotel
    P4145 上帝造题的七分钟2 / 花神游历各国
    P2579 [ZJOI2005]沼泽鳄鱼(邻接矩阵,快速幂)
    P2905 [USACO08OPEN]农场危机Crisis on the Farm(简单dp+麻烦“回溯”)
    day 2 上午 挂饰 背包
  • 原文地址:https://www.cnblogs.com/xiaoshahai/p/13139445.html
Copyright © 2011-2022 走看看