2016-08-10 5 views
0

ロックでオブジェクトを保護しようとしています。Javaで非最終オブジェクトで同期する正しい方法

"try..catch"という醜い構文のため、私はmutexを選択しませんでした。私は読みやすさを向上させることができますどのように...

class MyClass { 
    private final Object lock = new Object(); 
    private Channel channel = null; 

    public void setChannel() { 
     synchronized (lock) { 
      channel = new Channel(); 
      synchronized (channel) { 
       // setup channel 
      } 
     } 
    } 

    public void unsetChannel() { 
     synchronized (lock) { 
      synchronized (channel) { 
       channel.close(); 
      } 
     channel = null; 
     } 
    } 

    public boolean isSet() { 
     synchronized (lock) { 
      if (channel == null) 
       return false; 
      synchronized (channel) { 
       return channel.isActive(); 
      } 
     } 
    } 
} 

しかし、それは醜いと読みにくいようだ:

閲覧StackOverflowのは、私は、これが適切に私の目標を達成する方法であるという結論に達しました私の解決策?

+0

なぜ新しく作成されたオブジェクトをロックするのですか?メソッド全体を同期させることもできます –

+0

@ScaryWombat使用前に作成したオブジェクトに対してセットアップを行いたいと思います。私はこれをしてはいけませんか?単純化のために私のメソッドのコードを整理したので、メソッド全体を同期させたくありません –

+0

初心者には法的なJavaにすることで可読性を向上させることができます。あなたのメソッドはクラスの一部ですか?彼らは 'MyClass'の一部とされていますか? 'm_channelLock'とは何ですか?それにもかかわらず、私はあなたのコードについて同期よりも面倒なものは見当たりません。私は 'm_channelLock'が何であるか分からないので、あなたが何かを単純化できるかどうかは分かりません。 – ajb

答えて

1

あなたのロック方法を簡素化することができます実際には

class MyClass { 
    private final Object lock = new Object(); 
    private Channel channel = null; 

    public void setChannel() { 
     // other code can go here 

     synchronized (lock) { 
      channel = new Channel(); 
      // setup channel 
     } 

     // other code can go here 
    } 

    public void unsetChannel() { 

     // other code can go here 

     synchronized (lock) { 
      channel.close(); 
      channel = null; 
     } 

     // other code can go here 
    } 

    public boolean isSet() { 
     synchronized (lock) { 
      if (channel == null) { 
       return false; 
      } 
      return channel.isActive(); 
     } 
    } 
} 

は、lockオブジェクトは、チャネル変数へのアクセスを保護します。

channelと相互作用しない他のコードがロック外に存在する可能性がある場所を示します。

+0

男は[ここ](http://stackoverflow.com/a/21462631/4440694)は保護されたオブジェクトに同期する必要があると言った "RAMのために同期 "と呼ばれる。私は誰を信じるべきですか? :) –

+1

あなたのロックオブジェクトが最終的でない場合にのみ適用されます。私の例では、私は最終的なオブジェクト 'ロック'をロックしています。 – Jason

+0

私は最終的ではない「チャネル」オブジェクトを保護したいので、ソリューションは対象ですか? –

0

外側ロックlockはすべてを保護します。 2番目のロックは必要ありません。外側のロックが保持されている間は、2番目のスレッドには到達できません。

+0

男は[ここ](http://stackoverflow.com/questions/6910807/synchronization-of-non-final-field/21462631#21462631)あなたが保護されたオブジェクトに同期する必要があると言った "ためにRAMの同期の "。 1つのロックで十分ですか? –

関連する問題