2021-06-12 lock 锁 与synchronized 锁

//生产者与消费者
public class A {
    public static void main(String[] args) {
        Data data = new Data();
        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    data.increment();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"A").start();

        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    data.dencrement();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"B").start();

        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    data.increment();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"C").start();

        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    data.dencrement();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"D").start();

    }
}
//判断等待 业务 通知
class Data{
    //资源类
    private int number = 0;
    //+1
    public synchronized void increment() throws InterruptedException {
        while (number!=0){
          //等待
         this.wait();
        }
        number++;
        System.out.println(Thread.currentThread().getName()+"=>"+number);
        //通知其他线程,我+1完毕了
        this.notifyAll();
    }

    //-1
    public synchronized void dencrement() throws InterruptedException {
        while (number==0){
          //等待
            this.wait();
        }
        number--;
        System.out.println(Thread.currentThread().getName()+"=>"+number);
        //通知其他线程,我-1完毕了
        this.notifyAll();
    }
}
public class B {
    public static void main(String[] args) {
        Data2 data2 = new Data2();
        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    data2.increment();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"A").start();

        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    data2.dencrement();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"B").start();

        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    data2.increment();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"C").start();

        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    data2.dencrement();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"D").start();
    }
}
    //判断等待 业务 通知
    class Data2 {
        //资源类
        private int number = 0;
        Lock lock = new ReentrantLock();
        Condition condition = lock.newCondition();
        //+1
        public void increment() throws InterruptedException {
            lock.lock();
            try {
                while (number != 0) {
                    //等待
                    condition.await();
                }
                number++;
                System.out.println(Thread.currentThread().getName() + "=>" + number);
                //通知其他线程,我+1完毕了
                condition.signalAll();
            }catch (Exception e){
         e.printStackTrace();
            }finally {
                lock.unlock();
            }

        }

        //-1
        public void dencrement() throws InterruptedException {
            lock.lock();
            try {
                while (number == 0) {
                    //等待
                    condition.await();
                }
                number--;
                System.out.println(Thread.currentThread().getName() + "=>" + number);
                //通知其他线程,我-1完毕了
                condition.signalAll();
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }
    }

//顺序唤醒

/**
 * @author pangiggs
 * A过了是B,过了是C
 */
public class C {
    public static void main(String[] args) {
        Data03 data03 = new Data03();
        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                data03.printA();
            }
        },"A").start();
        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                data03.printB();
            }
        },"B").start();
        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                data03.printC();
            }
        },"C").start();
    }
}
class Data03{
    private Lock lock = new ReentrantLock();
    private Condition condition1 = lock.newCondition();
    private Condition condition2 = lock.newCondition();
    private Condition condition3 = lock.newCondition();
    private int number1 =1; //1A,2B,3C
    public void printA(){
        lock.lock();
        try {
           while (number1!=1){
               //等待
               condition1.await();
           }
            System.out.println(Thread.currentThread().getName()+"=>AAAAA");
           //唤醒制定的人线程 B
            number1 = 2;
            condition2.signal();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }


    }
    public void printB(){
        lock.lock();
        try {
            while (number1!=2){
                //等待
                condition2.await();
            }
            System.out.println(Thread.currentThread().getName()+"=>BBBBB");
            //唤醒
             number1 =3;
             condition3.signal();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }

    }
    public void printC(){
        lock.lock();
        try {
             while (number1!=3){
                 condition3.await();
             }
            System.out.println(Thread.currentThread().getName()+"=>CCCCCC");
             number1 =1;
             condition1.signal();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }

    }

}
上一篇:全局异常处理


下一篇:Java反射机制