gpt4 book ai didi

java - 线程安全访问私有(private)字段

转载 作者:行者123 更新时间:2023-12-01 19:51:42 25 4
gpt4 key购买 nike

所以我有以下场景(无法共享实际代码,但它会是这样的):

public class Test
{
private Object obj;

public void init()
{
service.registerListener(new InnerTest());
}

public void readObj()
{
// read obj here
}

private class InnerTest implements Listener
{
public synchronized void updateObj()
{
Test.this.obj = new Object();
// change the obj
}
}
}

InnerTest 类在服务中注册为监听器。该服务在一个线程中运行,对 readObj() 的调用是从不同的线程进行的,因此我的问题是,为了确保 obj 的一致性是否足以使UpdateObj() 方法已同步?

最佳答案

我建议使用另一个对象作为锁,以确保该类仅在访问 obj 时阻塞:

public class Test
{
private final Object lock = new Object();
private Object obj;

public void init()
{
service.registerListener(new InnerTest());
}

public void readObj()
{
synchronized(lock){
// read obj here
}
}

private class InnerTest implements Listener
{
public void updateObj()
{
synchronized(Test.this.lock){
Test.this.obj = new Object();
// change the obj
}
}
}
}

然后在所有需要对 obj 进行一致访问的方法中使用该锁。在当前示例中,使用 readObjupdateObj 方法。

此外,正如注释中所述,在 InnerTest 类的方法级别上使用 synchronized 并不会真正按照您的预期工作。也就是说,因为同步方法将在 this 变量上使用 synchronized block 。这只会阻塞您的 InnerTest 类。但不是外部 Test 类。

关于java - 线程安全访问私有(private)字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51149459/

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