• 线程的互斥与同步通信


    一. 互斥

      结局java线程中的互斥问题的的方法

       1.同步代码块,将敏感数据或者敏感操作放在同步代码块里,args代表一个参照,注意:多个方法调用同步代码块需要保证参照相同

    synchronized (args) {
      // Code                  
    } 

        ※ args:可以是对象,可以是属性,也可以是类的字节码(类的字节码Object.class,jvm中唯一) 

        2.synchronized作为方法的修饰符

    public synchronized void sync(int i){
       System.out.println(" message "); 
    }

    二. 同步通信

      同步通信使用Object提供的三个方法wait ,notify和notfiyAll三个方法,简单的理解为线程之间的通信,一个线程通知另一个线程

    三. JAVA一个经典习题

      子线程循环10次,紧接着主线程循环100次,紧接着子线程循环10次,主线程100次,如此往复50次

      

    public class TraditionalThreadTest {
        
        public static void main(String[] args) {    //主线程
            final BusinessTest b = new BusinessTest();
            new Thread(new Runnable() {    //子线程
                @Override
                public void run() {
                    for (int i = 1; i <= 50; i++) {
                        b.sub(i);
                    }
                }
            }).start();
            
            for (int i = 1; i <= 50; i++) {
                b.main(i);
            }
            
        }
    
    }
    class BusinessTest{
         private boolean flag = true;
         public synchronized void sub(int i){
             while (!flag) {    //true 執行
                try {
                    this.wait();    //false是等待
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
             for (int j = 1; j <= 10; j++) {
                System.out.println("子线程 : "+ j + ",第"+ i +"次打印");
            }
             flag = false;
             this.notify();    //通知下一个线程
             System.out.println();
         }
         public synchronized void main(int i){
             while (flag) {    //false 執行
                try {
                    this.wait();    //true 等待
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
             for (int j = 1; j <= 10; j++) {
                System.out.println("主线程 : "+ j + ",第"+ i +"次打印");
            }
             flag = true;
             this.notify();    //通知下一个线程
             System.out.println();
         }
    }

     实现原理:利用线程之间的通信获取flag的值,来确定是不是应该执行或者是应该停止

        注意这里的判断使用的是while而不是if,使用while的好处是可以自检

  • 相关阅读:
    Unity3d Android SDK接入
    Unity打包IOS和Android以及之间的交互
    Gradle
    General error: 1205 Lock wait timeout exceeded; try restarting transaction的解决办法
    kubeadm init [ERROR ImagePull]: failed to pull image [k8s.gcr.io/kube-apiserver-amd64:v1.11.3]: exit status 1
    yum安装kubectl时报错
    PhpStorm激活码 2020年3月亲测可用
    Vmware 14 安装 Vmware Tools 并配置宿主机共享文件给Vmware中Centos7系统
    期权
    对冲-风险对冲
  • 原文地址:https://www.cnblogs.com/duwenlei/p/5088758.html
Copyright © 2020-2023  润新知