猿问

同步对象并更改其字段之一

我试图理解涉及同步对象的部分代码,其中一个同步块更改了对象的某些字段。我正在查看的代码类似于以下内容:


public class ClassA {

    private ClassB someObject = new ClassB();


    public void FuncA() {

        synchronized(someObject) {

            //change some field of someObject

        }

    }


    public void FuncB() {

        synchronized(someObject) {

            //change some field of someObject

        }

    }

}

这是一个安全的做法吗?我在网上阅读了几页描述锁的安全实践的页面,但似乎没有一个涉及类似的例子。


任何帮助表示赞赏。谢谢!


12345678_0001
浏览 145回答 3
3回答

森栏

是的,这是安全的。someObject是私人所以只有FuncA和FuncB具有对它的访问。它们都同步,someObject因此someObject即使来自不同的运行线程,一次也只能执行其中一种方法。请注意,重要的是所有ClassA想要访问的方法都someObject应该在synchronizedon内进行,someObject以避免读取或写入不一致状态的风险someObject(除非您完全了解自己在做什么!)。

Smart猫小萌

是的,没关系。例如,这基本上是您(可以)在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    }}

拉风的咖菲猫

您有多种方法可以同步对方法的访问。根据同步要求,一个看起来比另一个更好。这是一个安全的做法吗?如果将其用于适合的用例,这是一种安全的做法。这里同步是有意义的,因为它锁定了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        }    }}但是这些会锁定整个对象,而这可能不是必需的。
随时随地看视频慕课网APP

相关分类

Java
我要回答