假设我有以下内容:
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/