3 回答
TA贡献1810条经验 获得超5个赞
是的,这是安全的。someObject
是私人所以只有FuncA
和FuncB
具有对它的访问。它们都同步,someObject
因此someObject
即使来自不同的运行线程,一次也只能执行其中一种方法。
请注意,重要的是所有ClassA
想要访问的方法都someObject
应该在synchronized
on内进行,someObject
以避免读取或写入不一致状态的风险someObject
(除非您完全了解自己在做什么!)。
TA贡献1911条经验 获得超7个赞
是的,没关系。
例如,这基本上是您(可以)在ArrayList从多个线程写入时执行的操作:您在列表上进行同步,并更新其字段(内部数组、大小等)。
需要注意的是,您不得someObject在任何地方以非同步方式访问。
public class ClassA {
private ClassB someObject = new ClassB();
public void FuncA() {
synchronized(someObject) {
//change some field of someObject
}
}
// ...
// BAD! Don't do this.
public void FuncC() {
// read some field of someObject
}
}
TA贡献1995条经验 获得超2个赞
您有多种方法可以同步对方法的访问。
根据同步要求,一个看起来比另一个更好。
这是一个安全的做法吗?
如果将其用于适合的用例,这是一种安全的做法。
这里同步是有意义的,因为它锁定了someObject这两种方法对它们执行修改的位置。
是的,您可以同步this或同步整个方法,例如:
public class ClassA {
private ClassB someObject = new ClassB();
public void FuncA() {
synchronized(this) {
//change some field of someObject
}
}
public void FuncB() {
synchronized(this) {
//change some field of someObject
}
}
}
但是这些会锁定整个对象,而这可能不是必需的。
添加回答
举报