假设我有以下内容:

public class Foo {
    private ReadingList mReadingList = new ReadingList();

    public ReadingList getReadingList() {
        synchronized (mReadingList) {
            return mReadingList;
        }
    }
}


如果我尝试在两个线程中修改ReadingList对象,那么上面的同步对我没有帮助,对吗?

// Thread 1
foo1.getReadingList().setName("aaa");

// Thread 2
foo2.getReadingList().setName("bbb");


我是否必须包装要同步的每个方法,如下所示:

public class Foo {
    private ReadingList mReadingList = new ReadingList();

    public synchronized void setReadingListName(String name) {
        mReadingList.setName(name);
    }

    public synchronized void setReadingListAuthor(String author) {
        mReadingList.setAuthor(author);
    }

    ...


等等,对于要公开和同步的ReadingList的每种方法?我最终只为ReadingList的每个方法编写包装方法。

谢谢

最佳答案

1.您可以访问ReadingList源

如果您有权访问ReadingList对象,则如果希望对所有字段进行同步访问,则将synchronized添加到ReadingList的所有方法中;如果只希望交错访问某些字段,则可以将特定的一组setter添加到其中。

2.您无权访问ReadingList

您将必须编写如下内容:

public class Foo {
    private ReadingList mReadingList = new ReadingList();

    public void setReadingListName(String name) {
        synchronized(mReadingList) {
           mReadingList.setName(name);
        }
    }

    public void setReadingListAuthor(String author) {
        synchronized(mReadingList) {
           mReadingList.setAuthor(author);
        }
    }

    ...


3.使用通用锁对象

根据Foo的性质以及整个目的的通用性,您可能会发现在ReadingList中只有一个或多个特定类提出了线程问题。

在这样的类中,您可以使用通用锁定对象:

public class Bar {
   Object readingListLock = new Object();

   public void someMethodThatModifiesReading() {
      synchronized(readingListLock) {
          foo.getReadingList().setName("1");
      }
   }

   public void someOtherMethodThatModifiesReading() {
      synchronized(readingListLock) {
          foo.getReadingList().setName("2");
      }
   }

   ...
}

关于java - 同步访问内部对象的方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11275097/

10-09 09:19