[英]Thread safe access to private field
所以我有以下情况(无法共享实际的代码,但是会是这样):
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
类在服务中注册为侦听器。 该Service在一个线程中运行,对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
进行一致访问的所有方法中使用该锁。 在您当前的示例中, readObj
和updateObj
方法。
同样如注释中所述,在InnerTest
类的方法级别上使用synchronized
不会真正按照您的预期工作。 也就是说,因为同步方法将在this
变量上使用synchronized
块。 这只会阻塞您的InnerTest
类。 但不是外部Test
类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.