synchronized可以有下面的两种格式1.用于方法声明中的
public synchronixed void addCount(){
count = count + 1;
}2.直接在代码段中加入
public synchronized void addCount(){
synchronized(this){
count = count + 1;
}
}
请问这两种方式,有什么不同啊?

解决方案 »

  1.   

    这两个效果是一样的,直接写synchronized相当于synchronized(this)。
      

  2.   

    2楼的说的没错,当用synchronized修饰方法时,它会对所有引用对象加锁,而采用synchronized块时,只对块中引用对象加锁,另外,也可看出两者在加锁时的时效
      

  3.   

    Java 其实提供三种 synchronizedSynchronized 类方法: class class_name {
       static synchronized type method_name() {
          statement block
       }
    }
    以上这个方法中的代码段是同步的,那个锁是类对象。Synchronized 实例方法: 
    class class_name {
       synchronized type method_name() {
          statement block
       }
    }
    以上这个实例方法中的代码段是同步的,那个锁是这个类的一个实例。Synchronized 代码段: class class_name {
       type method_name() {
          synchronized (object) {
             statement block
          }
       }
    }
    以上加粗的代码段是同步的,那个锁是那个 object举例来说, 以下代码有两个同步代码段,用的却是同一把锁:这个类的一个实例 this
    class class_name {
       type method_name() {
          synchronized (this) {
             statement block 1
          }
       }
       synchronized type method_name() {
          statement block 2
       }
    }所以代码段1永远不会和代码段2同时执行。基于以上讨论,我认为一楼的说法是正确的。这两个效果是一样的。
      

  4.   

    方法声明中加入 synchronized关键字
      public synchronized void accessVal(int newVal);
      
       synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。  这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。2. synchronized 块:通过 synchronized关键字来声明synchronized 块。语法如下:  synchronized(syncObject)
      {
       //允许访问控制的代码
      }   
      synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。
      

  5.   

    public synchronized void xxxFunction()
    同步方法(参照当前对象,执行此方法时将为此对象加锁,以至于此方法退出前其他标有此关键词的此对象方法将被阻塞)
    synchronized(Object)
    同步代码块(参照Object,为this时则为参照当前对象,其他与上述无异)
      

  6.   

    少说一句,同步代码块的作用域在synchronized{}中,可以自由定制,进入时加锁,执行完后去锁,其他同对象的synchronized{} 或synchronized()将会有一个从阻塞状态转为执行状态。