gpt4 book ai didi

java - 同步访问内部对象的方法?

转载 作者:行者123 更新时间:2023-11-30 09:35:37 26 4
gpt4 key购买 nike

假设我有以下内容:

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。您没有访问阅读列表的权限

你必须这样写:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com