_channel = new Channel(...);
synchronized (_channel)
私はそれがsync'edする必要があり、他のスレッドがチャネルを開けないと この期間中に何かを送信する必要があります。
あなたのコードのように思われているように思えます。 xHandler
インスタンスごとに新しいChannel
オブジェクトを作成し、この特定のChannel
ロックを取得するので、2つのスレッドが同時に実行される可能性があります。
- インスタンス1は、チャネルインスタンス1を作成し、それが
- xHandlerインスタンス2ロックです取得すると、それはどちらもあなたが本当に行う必要がある何を同時に
をされ実行
ロックのチャネル・インスタンス2を作成し、取得しxHandler
- ムーを同期する特定の
Channel
オブジェクトを共有するltiple xHandler
インスタンス(例:にに割り当て、コンストラクタにChannel
のインスタンスを受け取り、_channel = new Channel(...);
行を削除して、同期コードをそのまま使用してください)。
Channel.class
で同期します。これは、xHandler
の2つの異なるインスタンスが決して同時に使用できないことを意味します。
二つの異なるxHandlersための具体的なChannel
を共有する例:
class xHandler
{
private final Channel _channel;
public xHandler(Channel channel)
{
this._channel = channel
}
// Methods...
void init()
{
synchronized (_channel)
{
// Do some stuff here...e.g.
_channel.send("...");
}
}
public static void main(String[] args)
{
Channel myChannel = new Channel(...);
xHandler xHand1 = new xHandler(myChannel);
xHandler xHand2 = new xHandler(myChannel);
// Code to create/start your threads.
// xHand1 and xHand2 will not use myChannel simultaneously
}
}
あなたのコードは無効です - あなたはあなたの 'init'メソッド内でフィールドを宣言することはできません...あなたがすることを意味しました簡単な割り当てですか? –
変更可能なフィールドは、プライベートチャネル_channelが最終的でないことを意味します。フィールドを最後に設定してみてください。 – darijan
ヒントのためのThx Jon Skeet、私は編集しました、今は正しいはずです。 – arge