public class MaxScore {
    int max;
    public MaxScore() {
        max = 0;
    }
    public synchronized void currentScore(int s) {
        if(s> max) {
            max = s;
        }
    }
    public int max() {
        return max;
    }
    public synchronized void reset() {
        max = 0;
    }
 
}当多个线程访问reset方法(当被访问时)不仅将阻塞 reset() 方法的其他调用,而且也将阻塞 MaxScore 类的同一个实例中的 currentScore() 方法,因为这两个方法都访问同一个锁(this)
import java.util.*;
public class Jury {
    Vector members;
    Vector alternates;
    public Jury() {
        members = new Vector(12, 1);
        alternates = new Vector(12, 1);
    }
    public synchronized void addMember(String name) {
        members.add(name);
    }
    public synchronized void addAlt(String name) {
        alternates.add(name);
    }
    public synchronized Vector all() {
        Vector retval = new Vector(members);
        retval.addAll(alternates);
        return retval;
    }
}
 此处多个线程可以同时访问addMember,addAlt,all方法吗?如果可以上面的那段话是哪儿错了呢?

解决方案 »

  1.   


    import java.util.*;
    public class Jury {
        Vector members;
        Vector alternates;
        public Jury() {
            members = new Vector(12, 1);
            alternates = new Vector(12, 1);
        }
        public void addMember(String name) {
            synchronized(members) {
              members.add(name);
            }
        }
        public void addAlt(String name) {
            synchronized(alternates){
               alternates.add(name);
            } 
            
        }
        public synchronized Vector all() {
            Vector retval = new Vector(members);
            retval.addAll(alternates);
            return retval;
        }
    }按楼主的意思,只要锁不同的对象就可以了
      

  2.   

    不可以,每个对象都有一把锁,锁只能被一个线程获得。并发环境下,线程执行对象的synchronized方法时需要获得对象的锁。所以被标记为synchronized的方法是互斥访问的。所以要提高并发度,必须减小锁的粒度,像3L就是一种方法
      

  3.   


    应为当其中一个线程访问带有synchronized方法时,他就拿到了对象锁Jury (this),其它线程就被拒之门外了(不知道说的对不对)