• Java并发(思维导图)【待评估、删除】


    1,

    2,

    3,常用函数

    Semaphore 
    import java.util.concurrent.Semaphore;
    Semaphore name=new Semaphore(n); name.acquire(n1); acquire.release(n2);

    lock中的wait,notify,notifyAll

    4,相关例题

    Answer-1:

    解决办法:

    注意这里使用lock-synchronized同步以及屏障

    package com.cnblogs.mufasa.demo1.Answer1114;
    
    class Foo {
        private boolean firstBlock;
        private boolean secondBlock;
        private Object lock=new Object();
    
        public Foo() {
    
        }
    
        public void first(Runnable printFirst) throws InterruptedException {
    
            synchronized(lock){
                // printFirst.run() outputs "first". Do not change or remove this line.
                printFirst.run();
                firstBlock=true;
                lock.notifyAll();
            }
    
        }
    
        public void second(Runnable printSecond) throws InterruptedException {
    
            synchronized(lock){
                while(!firstBlock){
                    lock.wait();
                }
                // printSecond.run() outputs "second". Do not change or remove this line.
                printSecond.run();
                secondBlock=true;
                lock.notifyAll();
            }
    
        }
    
        public void third(Runnable printThird) throws InterruptedException {
    
            synchronized(lock){
                while(!secondBlock){
                    lock.wait();
                }
                // printThird.run() outputs "third". Do not change or remove this line.
                printThird.run();
            }
        }
    }

    Answer-2:

    解决方法:

    ①定义一个布尔标识符flag,决定轮替输出;

    ②设置一个lock-synchronized同步;

    package com.cnblogs.mufasa.demo1.Answer1115;
    
    class FooBar {
        private int n;
    
        private boolean flag=false;//定义一个布尔标识位
        private Object lock=new Object();//同步锁
    
        public FooBar(int n) {
            this.n = n;
        }
    
        public void foo(Runnable printFoo) throws InterruptedException {
    
            for (int i = 0; i < n; i++) {
                synchronized (lock){
                    while (flag){
                        lock.wait();
                    }
                    // printFoo.run() outputs "foo". Do not change or remove this line.
                    printFoo.run();
                    flag=true;
                    lock.notifyAll();
                }
            }
        }
    
        public void bar(Runnable printBar) throws InterruptedException {
    
            for (int i = 0; i < n; i++) {
                synchronized (lock) {
                    while (!flag) {
                        lock.wait();
                    }
                    // printBar.run() outputs "bar". Do not change or remove this line.
                    printBar.run();
                    flag=false;
                    lock.notifyAll();
                }
            }
        }
    }

     

  • 相关阅读:
    关于DOS的常用操作
    <leetcode 第188场周赛>
    大挑战!状压dp!
    41. 缺失的第一个正数
    1095. 山脉数组中查找目标值 (二分查找)
    “人活着就是为了贪心”——贪心算法日
    二分查找
    2020.4.25 leetcode 编程战队赛
    <leetcode c++>221. 最大正方形
    <leetcode c++>面试题51. 数组中的逆序对
  • 原文地址:https://www.cnblogs.com/Mufasa/p/11398373.html
Copyright © 2020-2023  润新知