对引用/指针变量进行同步工作吗?

时间:2012-02-08 02:34:50

标签: java android

所以我知道同步关键字的工作原理如何,但是我认为它可以正常工作(即两个线程在添加或删除时不会踩到彼此的脚趾)

public MyClass myClass = new MyClass();
public MyClass2 myClass2 = new MyClass2();

public class MyClass {
     private ArrayList<String> myString = new ArrayList<String>();

     public ArrayList<String> GetArrayList() {
         return myString;
     }
     public MyClass() {
          new Thread(new Runnable {
               public void run() {
                   synchronized(myString) {
                       /* add or remove myString elements */
                   }
               }
          }).start();
     }

}


public class MyClass2 {
     // Pointer to myString
     ArrayList<String> refString;
     public MyClass2() {
          refString = myClass.GetArrayList();
          new Thread(new Runnable {
               public void run() {
                   synchronized(refString) {
                       /* add or remove refString elements */
                   }
               }
          }).start();
     }
     }
}

编辑:下次我将在eclipse中输入此内容并复制和粘贴:)

3 个答案:

答案 0 :(得分:2)

它会工作,但为什么不使用Collections.synchronizedList(new ArrayList)?

如果你正在做的只是ADD或REMOVE,而不是check-then-act(例如if!myList.contains {myList.add})那就是你所需要的,并且你避免使用synchronized块使你的代码变得丑陋< / p>

答案 1 :(得分:1)

是的,它会起作用。您正在处理对同一对象的引用,因此将使用synchronized语句锁定和测试相同的对象。

答案 2 :(得分:0)

首先,同步块可以处理对象,所以如果你使用一个对象来同步你的关键部分,它就可以工作了。但你在myClass2构造函数中做了什么。你在myClass2构造函数中定义了myClass构造函数,它不是一个有效的代码。