[英]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.