已经是同步操作.
你在A中已经用synchronized限制对sa的操作:同步操作。

解决方案 »

  1.   

    我比较迷惑得是B与C中都有 A实例,在内存中A 就有两个实例及两个sa 数组。同步操作的时候不是互相不关联麻。我认为在B与C调用A的相同实例时才是同步操作。
    例如:
    public  class  A{ 
      private  String  []  sa=new  String[10]; 
      //或使用private  static  String  []  sa=new  String[10]; 
      public  A(){ 
        //init  sa 
    }   public  synchronized  void  setStringArray(String  aa,int  num) 
          throws  Exception{ 
          sa[num]=aa; 
    } } public  class  B  implements  Runnable{ 
        private A a;
        public B(A aa){
          a=aa;
        } 
        public  void  run(){ 
          while(flag){ 
              try{ 
              a.setStringArray("12345",3); 
              }catch(Exception  e){} 
          } 
        } 
    } public  class  C  implements  Runnable{
        private A a;
        public C(A aa){
          a=aa;
        }  
        public  void  run(){ 
          while(flag){ 
              try{ 
              a.setStringArray("assgff",3); 
              }catch(Exception  e){} 
          }     } 

    B与C中的aa指向同一地址。
      

  2.   

    ddtqfly() ,你不是已经明白了么?B,C是两个类怎么同步?再说了,B,C也没有出现资源共享的问题呀。
      

  3.   

    roundSide() 你没有理解我的意思,我是说B,C在对A调用setStringArray()时的
    同步操作
      

  4.   

    如果你用
    //或使用private static String [] sa=new String[10]; 
    那么sa在各个实例中是指向同一个对象的。
    static是class范围的。
      

  5.   

    但是在A中的setStringArray()是在A的实例级上的,不是在Class级上,当
    B与C调用此方法时只是对自己的A实例加了锁
    所以我认为他们是不同步的,不知各位高手有没有其他意见?
      

  6.   

    “当B与C调用此方法时只是对自己的A实例加了锁”就是这样啊,B、C互不干扰。如果用static就不一样了,这时候会有同步问题。
      

  7.   

    支持ddtqfly() ,B和C中的实例是两个不同的实例,应该没有同步问题,
      

  8.   

    B,C中是不同A实例的对象
    但是在调用A中方法是对同一个class范围的数组操作
    同步问题不在对象A上,在sa这个数组上
    所以我认为较好的写法是:
    private static String [] sa=new String[10]; public void setStringArray(String aa,int num) 
    throws Exception{ 
        try {
            synchronized (sa) {
                sa[num]=aa; 
            }
        } catch (InterruptedException e) {
             /* do something */
        }} 
      

  9.   

    当sa是static时,java代码会对class A加锁,所以B和C是有同步关系的