zoukankan      html  css  js  c++  java
  • 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();
                }
            }
        }
    }

     

  • 相关阅读:
    从零开始学习前端开发 — 17、CSS3背景与渐变
    从零开始学习前端开发 — 16、CSS3圆角与阴影
    从零开始学习前端开发 — 15、CSS3过渡、动画
    从零开始学习前端开发 — 14、CSS3变形基础
    link标签的media属性的用法
    html的meta总结
    提高网页可访问性的十条建议
    关闭按钮
    HTTP协议详解
    jquery中each的3种遍历方法
  • 原文地址:https://www.cnblogs.com/Mufasa/p/11398373.html
Copyright © 2011-2022 走看看