簡體   English   中英

線程安全訪問私有字段

[英]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進行一致訪問的所有方法中使用該鎖。 在您當前的示例中, readObjupdateObj方法。

同樣如注釋中所述,在InnerTest類的方法級別上使用synchronized不會真正按照您的預期工作。 也就是說,因為同步方法將在this變量上使用synchronized塊。 這只會阻塞您的InnerTest類。 但不是外部Test類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM