2017-03-29 9 views
-2

getInstanceの実行中にOutOfmemoryエラーが発生しました。私はスレッドダンプをチェックし、スレッドがブロックされていることを発見しました(getInstanceでモニターロックを待っています)。OutOfMemoryエラー:静的メソッド内の同期ブロック

私はマルチスレッドで非常に初心者です。以下の実装が正しいかどうか誰にも教えてください。そうでない場合は、どのように改善できますか?

class MyClass { 
    private static MyClass instance = new MyClass(); 
    public static MyClass getInstance() throws Exception { 
     synchronized (instance) {...} 
    } 
    public static MyClass clearInstance() throws Exception { 
     synchronized (instance) {...} 
    } 
} 
+1

静的メソッド内の非静的フィールドをどのように参照できますか? – shizhz

+0

@shizhz ..申し訳ありませんがコードを更新しました! –

+0

メソッド 'getInstance'と' clearInstance'の実装を投稿すると良いでしょう。そして問題を再現する方法:-) – shizhz

答えて

0

これは、マルチスレッドについての問題ではないのですが、あなたはMyclassのオブジェクトを作成するときには、Myclassの別のオブジェクトを作成し、それが終わることはありませんループに入りinstance変数のインスタンスを持っています。

だから、メモリ不足またはスタックオーバーフローエラーが発生しています。

+0

つまり、MyClassの2つの異なるインスタンスで同期する必要がありますか? –

+0

@Sanchit Khera自分自身のインスタンスを再帰的に作成するオブジェクトのインスタンスを作成することはできません。 – TameHog

+0

'instance'はインスタンスメンバではなく、スタックオーバーフローは何も言及されていません。 – EJP

関連する問題