2011-11-15 13 views
1

グローバル変数であるIntegerクロックを持つクラスがあり、0に初期化されています。スレッドを開始するいくつかのスレッドコンストラクタに 'clock'を渡します。スレッド内で 'clock'の増分が見えるかもしれませんが、呼び出しプロセスでは 'clock'は常に0です。Integerはオブジェクトで、オブジェクトは参照渡しであるため、 'clock'の変更が見られるはずですどこにでも。これは当てはまりませんか?スレッドで参照渡しで整数を渡す

+1

Javaは*値渡し*特に*参考値*です。しかしそれとは別に、 'Integer'(実際には、すべてのautoboxクラス)は不変です。それを変更することはできません。 –

答えて

5

使用可変であるIntegerのラッパーを作成することです。

intアトミックに更新される値。原子変数のプロパティの説明については、java.util.concurrent.atomicパッケージ仕様を参照してください。 AtomicIntegerは、アトミックインクリメントカウンタなどのアプリケーションで使用され、Integerの代わりに使用することはできません。しかし、このクラスはNumberを拡張して、数値ベースのクラスを扱うツールやユーティリティによって一様にアクセスできるようにします。

+0

私は知らなかった別の図書館が存在しました... –

+1

これはライブラリではありません。これはJava SEの一部です。 –

0

Integer不変オブジェクトです。その値を別のスレッドから変更することはできません。スレッド内で使用するときはfinalと宣言しなければならないので、変数を再割当てすることはできません。

これを回避する方法はAtomicInteger代わりのInteger

class MutableInteger { 
    private int integer; 

    synchronized void setInteger(int integer) { ... } 
    synchronized int getInteger() { ... } 
} 
+0

ダー、それを忘れてしまった。しかし、intフィールドを持つClockオブジェクトを作成し、increment()を呼び出すと正しく動作しますか? – Rooster

+0

はい、複数のスレッドから書き込み/読み取りを行っている場合は、 'synchronized'修飾子を使用してスレッドセーフにすることをお勧めします。 –

+0

ああ、それは私の時計オブジェクトに似ています。ありがとう! – Rooster