私はJavaを学んでいる初心者です。今、質問があります。誰かが解決するのを手伝ってくれませんか? :)
ハッシュマップ変数を保持する Server という名前のクラスがあり、send() と receive() という名前の 2 つのメソッドがあります。2 つのメソッドを同時に実行したい。send() メソッドは hashmap 変数を使用し、receive() メソッドは hashmap 変数を変更します。
それを解決するのを手伝ってください。どうもありがとう!
私はJavaを学んでいる初心者です。今、質問があります。誰かが解決するのを手伝ってくれませんか? :)
ハッシュマップ変数を保持する Server という名前のクラスがあり、send() と receive() という名前の 2 つのメソッドがあります。2 つのメソッドを同時に実行したい。send() メソッドは hashmap 変数を使用し、receive() メソッドは hashmap 変数を変更します。
それを解決するのを手伝ってください。どうもありがとう!
送信スレッドと受信スレッドを生成するメイン スレッドで HashMap を定義します。競合状態に陥らないように、必ず SynchronizedMap を使用してください。
使用できますCollections.synchronizedMap(new HashMap());
編集 1: コード テンプレート
public class Server
{
private static Map<String,String> map = Collections.synchronizedMap(new HashMap<String, String>());
public void send()
{
//
// Do some operation using map variable
}
public void receive()
{
// change the map variable as you want
//
}
}
CONcurrentHashMapを使用する
複数のスレッドをブロックすることなく、複数のスレッドから Map を同時に変更できます。
アイテムはデフォルトで共有されます。必要なのは、共有を制御し、2 つのスレッドが同時にそれを変更しようとするのを防ぐための何らかの形式のロックまたはミューテックスです。
または、 ConcurrentHashMapを使用することもできます
2 つの解決策があります。最も簡単な方法は、スレッド セーフなハッシュマップ、つまり ConcurrentHashMap を使用することです。JVM が処理するので、同期の問題について心配する必要はありません。同じことについて Javadoc を調べてみるとよいでしょう。
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ConcurrentHashMap.html
もう 1 つの方法は、send() メソッドと receive() メソッド、またはハッシュマップを更新するメソッドの一部を同期することです。