zoukankan      html  css  js  c++  java
  • 在其他对象上同步

         synchronized 块必须给定一个在其上进行同步的对象,并且最合理的方式是,使用其方法正在被调用的当前对象:synchronized(this).

    在此种方式中,如果获得了synchronized块上同步锁,那么该对象其他的synchronized方法和临界区就不能被调用。因此,如果再this上同步,

    临界区的效果就会直接缩小在同步的范围内。

         但有时必须在另一个对象上同步,如果这么做,就必须确保所有相关的任务都是在对象上同步的。例如下面例子俩个任务可以同时进入同一个

    对象,只要此对象上的方法在不同的锁上同步即可:

    public class DualSynch {

          private Object syncObject=new Object();  

         public synchronized void f(){

             for(int i=0;i<5;i++){   

                System.out.println("f()");    

                Thread.yield();

           }  

       }

         public void g(){   

            //synchronized(this){    

            synchronized(syncObject){  

                for(int i=0;i<5;i++){    

                System.out.println("g()");     Thread.yield();    

              }   

           }  

        }  

    public static void main(String[] args) {

        DualSynch ds=new DualSynch();      

        new Thread(){    

        public void run(){     

           ds.f();   

        }   

       }.start();   

        ds.g();   

       }

    }

    输出如下:

    g()
    f()
    f()
    f()
    f()
    f()
    g()
    g()
    g()
    g()

    结论:通过输出可以看出,俩个方式在同时运行,因此任何一个方法都没有因为对另一个方法的同步而被阻塞。

  • 相关阅读:
    初识Kafka
    初学Linux (Linux_note)
    Zookeeper_ACL
    Zookeeper简单配置
    getWindow().setFlags
    设置session失效时间
    Android开发者必知的5个开源库
    oracle A用户访问B用户的表aa
    oracle 根据约束名查表名
    java ftp上载下传 遇到的问题
  • 原文地址:https://www.cnblogs.com/beijingstruggle/p/4999390.html
Copyright © 2011-2022 走看看