一个类中有两个私有变量,a,b。那么这两个方法能阻止多线程问题么?
public synchronized int read{return a+b;}
public synchronized void set(int a,int b){this.a=a;this.b=b;}
我总是觉得虽然这两个方法同步,但是当两个线程访问的时候,当第一个线程调用set后,释放锁,第二个线程正好调用read方法,这样也会有线程问题,不知道这么理解有什么错误?谢!

解决方案 »

  1.   

    你是说这种情况? 一个线程没set完的时候 另一个线程不能去read 
      

  2.   

    楼主说的情况不会有线程同步问题(前提是楼主所谓的“私有变量” a,b 是实例的,a,b 更通常的叫法是实例域)。因为同步锁属于每个对象而不是同步方法,所以当第一个线程调用 set 方法时此对象的同步锁已被取走,在第一个线程调用完 set 方法并将同步锁还给该对象前,第二个线程不可能进入 read 方法开始执行读操作。
      

  3.   

    那锁还给对象后,第二个线程就能调用read了,不过这个数据还是第一个线程设置的,所以第二个线程要是read的话,还会有线程问题的对吧?
      

  4.   

    会有问题, 在访问a,b前要做一个锁,锁上加Sync
      

  5.   

    SAGEZK:如果a和b是static的那么会不会有并发问题?
      

  6.   

    static的变量是类级别可访问的,如果这个类从始至终只创建了一个对象,不会有问题,如果创建了多个对象,每个对象又是多线程来访问的,就会有问题。