zoukankan      html  css  js  c++  java
  • 线程同步

    1.线程同步(互斥-独占)
       a.为什么? 
         目的:为了解决数据的并发异常。
          多个线程  操作同一个资源的时候,可能会引发数据不一致。 
          资源叫做  临界资源。
          现象叫做  并发。
       b.同步本质
          每一个对象,有且只有一个对象(锁)监视器(同步锁)。
          并且,对象监视器 只能被一个线程持有。
     
         synchronized  研究的是 线程 与  对象监视器
         之间的关系。
     
     
       c.应用
         打电话
     
         单例
           I.不允许外部 new 该对象
               构造器 private
           II.势必类 内部  提供一个方法  为
           外部 得到 该 类的 实例   只能静态方法
           III.确保  单例
        懒:static 静态方法
        饿:synchronized  块  代码 执行 性能很差
            private static  A a = new A();
     
     
    2.同步 协助
     
       生产者消费案例
     
     
     
    public class Tel{
         public String name;
         public void call(){
              for(int i=1;i<10;i++){
                   System.out.println(Thread.currentTread().getName()+"用电话"+name+"拨号"+i+"--");
                  try{
                        Thread.sleep(100);
                   }catch(InterruptedException e){
                        e.printStackTrace();
                   }
                 
              }
         }
    }
     
     
    public class Persnon extends Thread{
     
         public Person(String name){
              super(name);
         }
     
         public Tel tel;
     
         public Tel getTel(){
              return tel;
         }     
     
         public void setTel(Tel tel){
              this.tel=tel;
         }
     
         public void run(){
              Synchronized(tel){    //同步块(同步锁)(项目中,同步锁的效率极低)
              tel.call();
              }
         }
    }
     
     
     
    public class Test{
         public static void main(String[])args{
              Tel t1 = new Tel();
              t1.name = "摩托罗拉";
              Tel t2 = new Tel();
              t2.name = "诺基亚";
              
         
              Person p1 = new Person("张三线程");
              p1.setTel(t1);
              Person p2 = new Person("李四线程");
              p2.setTel(t2);
             
              p1.start();
              p1.start();
         }
    }
     
     
     
     
    /**
    *单例
    */
    public class A{
         private static A a;
         private A(){
             System.ou.println("-----"); 
         }
         public static A getInstance(){
             if(a==null){
                   a=new A();
              } 
              return a;
         } 
    }
     
    /**
    *测试
    */
    public class Test(){
         new Tread(){
              public void run(){
                   A.getInstance();
              }
         }.start();     //匿名内部类
     
         A.getInstance();
         A.getInstance();
         A.getInstance();
    }
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    List数据去重的五种有效方法
    select 1 from ... sql语句中的1代表什么意思?
    gitlab 创建一个空的分支 将本地代码推到特定分支
    Error running 'dt-assets-monitor [clean]': Cannot run program "C:Program Files (x86)Javajdk1.8.0_73injava.exe" (in directory "E:codedt-assets-monitor")
    Git SSH Key 生成步骤
    Git,GitHub与GitLab的区别
    聊聊TCP Keepalive、Netty和Docker
    centos7设置非图形界面
    PHP mysqli 使用预处理语句防注入
    用传纸条讲 HTTPS
  • 原文地址:https://www.cnblogs.com/nin-w/p/5907473.html
Copyright © 2011-2022 走看看