public synchronized void Push(char c)
{
  //  :-)
}
这里synchronized 同步的是什么?我一直没有搞懂,我知道应该同步共享的变量,可是难以理解,尤其是synchronized(this),这个this是什么?!不会是Class的引用吧!请高手指点一二

解决方案 »

  1.   

    this 是当前对象。也就是我们在同步里提到的对象锁。
    synchronized void Push(char c)
    -----------在这里,同步的是方法
    其实synchronized(Object o)这是块的同步,只要得到对象o,就可以开始这个代码块,而synchronized(this)是最泛泛得同步,只要有个对象就可以同步,
      

  2.   

    sychronized(this)是对对象自身的同步,就是你在访问自己的成员是需要进行同步访问。
    实际上
    public synchronized void Push(char c)
    {
      //  :-)
    }
    相当于
    public void Push(char c)
    {
    synchronized(this){
      //  :-)
    }
    }
      

  3.   

    事实上要同步的是个变量啊,比如char c,那怎么和this有关呢?
    我想应该是synchronized(c)比较合理吧?!?!?
      

  4.   

    非也,要同步的是一段代码,这段代码可以由多个线程访问,为了达到同步的效果,于是java就设置了对象锁这个东西,一个线程要访问一段被同步的代码(synchronized所修饰)就必须获得它的对象锁,同时他还会把对象锁锁起,这样在这个现存释放这个对象锁前其他线程是不能获得这个对象锁的,这样就能达到同步的目的,所以synchronized(Object)因该是一个对象的实例,是什么对象都可以
      

  5.   

    synchronized加锁不管是加在方法上还是,直接加在一个对象上synchronized(this或者obj),一个对象只能加上一个锁,加在方法上表示,多个线程中run()方法如果调用执行了这个加锁的方法,那么在同一时刻只能有一个线程来访问这个方法。
    如果直接synchronize(this或者obj)就表示多个线程想使用this对象或者obj对象中的方法或者变量,那么同一时刻只能有一个线程能够获得synchronized这个锁,并且进入此对象执行对象中的方法或者改变变量。
      

  6.   

    synchronized加锁不管是加在方法上还是,直接加在一个对象上synchronized(this或者obj),一个对象只能加上一个锁,加在方法上表示,多个线程中run()方法如果调用执行了这个加锁的方法,那么在同一时刻只能有一个线程来访问这个方法。
    如果直接synchronize(this或者obj)就表示多个线程想使用this对象或者obj对象中的方法或者变量,那么同一时刻只能有一个线程能够获得synchronized这个锁,并且进入此对象执行对象中的方法或者改变变量。