2011-01-31 8 views
-2

私は複数のユーザーとオフィスLAN上で使用されるストックシステムを構築しています。同期キーワードを使用して在庫を正しく更新する方法についての質問があります。私がやりたいことは、複数のユーザーが株式を更新できるようにすることですが、もちろん1人のユーザーのみが一度に更新できるようにします。私は在庫の更新のために以下のような方法を作成しました:Java Synchronizedを使用する正しい方法は?

public static synchronized boolean UpdateXYZStock(Stock so){ 
//update code 
} 

これは正しい方法ですか?

おかげ

S.

+0

ここで詳細を詳しく説明する必要があります。 – Woot4Moo

+0

java synchronizedはVMにまたがっていません。このような同期の問題をデータベースに処理させることを検討することもできます。 UpdateStock()はDBの株価を更新します。 – DwB

答えて

4

私はオブジェクトではなく、クラスのインスタンスにロックします。つまり、クラスをロックしているので静的メソッドをロックしません。それに加えて、基礎となるオブジェクトをロックすることができます。

private final Object writeLock = new Object(); 

public boolean UpdateXYZStock(Stock so) { 
    synchronized(writeLock) { 
     ... 
    } 
} 

ので、より細かくロックの粒度を制御することができる(私はこの方法は、サーバー内のコンポーネントであると仮定し、したがって、複数のクライアントにサービスを提供しています)

+0

基本オブジェクトにロックすると、更新コードが1回だけ実行されることが保証されますか?複数のユーザーがいる場合、同時に更新することはできません。 – Santiago

+0

そうです。可能であれば、データベース内のトランザクションと保証されたアトミック性を利用する必要があることにも注意してください。 –

+0

素晴らしい、ありがとうたくさんのブライアン! – Santiago

1

静的に同期の唯一の問題メソッドは、実際にクラス全体を同期させているということです。したがって、そのクラスに複数の静的メソッドがある場合、このクラスが同期されているという事実により、このクラスが完了するまで他のクラスが静的メソッドにアクセスできなくなります。

それ以外の場合は、必要なものを達成する必要があります。

+0

私はクラス内に他の静的メソッドを持っているので、私はブライアンの提案がより適切だろうと思う。 – Santiago

0

また、ReadWriteLockの使用を検討することもできます。

0

​​を使用しても問題ありません。実際にデータを格納する場所によって異なります。オブジェクト内に格納されている場合は、このオブジェクトのモニタ、つまり非静的同期メソッドを使用します。

データベースにデータを格納する場合は、テーブル内のこの行を更新するすべてのコードが同じロックを使用していることを確認してください。これは、他の応答で強調表示されているように、静的フィールドで使用可能にすることができます。 (ちょうどモニターとして動作するためにストリングを使用しないでください)。

+0

コードはデータベースに格納されています – Santiago

+0

データベースのための楽観的または悲観的なロックプロトコルを使用していますか? –

+0

オプティミスティックロック – Santiago

関連する問題