Warum gibt es in diesem Java-Code keinen Rennzustand, wenn ich ein Lese-Update-Schreiben mache? [Duplikat]Java

Java-Forum
Guest
 Warum gibt es in diesem Java-Code keinen Rennzustand, wenn ich ein Lese-Update-Schreiben mache? [Duplikat]

Post by Guest »

Mein Code hat viele Threads, die ohne Synchronisation zu einer gemeinsamen Hash-Map zu einer gemeinsamen Hash-Map gelesen werden. Ich habe so viele Male mit 1000 Threads und 1M -Iterationen ausgeführt. Ich gehe davon aus Gleichzeitig. FWIW, ich schreibe diese Spielzeuganwendung, um sie so zu vergleichen, wenn ich Sammlungen verwende P>

Arbeit Dauer: 39.496 < /p>
Taste: 0 VAL: 250000000 < /p>
Schlüssel: 1 val: 250000000
Taste: 2 VAL: 250000000
Taste: 3 Val: 250000000

Code: Select all

package threadsafecollections;

import java.util.HashMap;
import java.util.Map;

public class SynchronizedCollectionTask {

public static int NUM_THREADS = 1000;

public static class ReadUpdateWrite implements Runnable {

Map map;
int threadId;
public static int NUM_ITERATIONS = 1000000;

ReadUpdateWrite(Map m, int threadId) {
this.map = m;
this.threadId = threadId;
}

@Override
public void run() {
for (int i = 0; i < NUM_ITERATIONS; i++) {
int key = threadId % 4;
Integer val = this.map.get(key);
map.put(key, val == null ? 1 : val + 1);
}

// At this point I expect each key in map to have value of CLOSE TO
// numThreads * NUM_ITERATIONS / 4 = 250M.  I expect some threads to have
// both read the same value, and therefore "miss" a write.  For example,
// thread 4 and 8 both read key = 0 and see value = 3.  Now both thread
// increment value to 4, instead of one thread incrementing to 4 and the
// other incrementing to 5.
}

}
public static void main(String[] args) throws InterruptedException {
Map sharedMap = new HashMap();

// Initialize threads
Thread[] readers = new Thread[NUM_THREADS];
for (int i = 0; i < NUM_THREADS; i++) {
readers[i] = new Thread(new ReadUpdateWrite(sharedMap, i));
}

long start = System.currentTimeMillis();

// Start threads
for (int i = 0; i < NUM_THREADS; i++) {
readers[i].run();
}

// Join threads
for (int i = 0; i < NUM_THREADS; i++) {
readers[i].join();
}

long end = System.currentTimeMillis();

System.out.println("Work took: " + (end - start) / 1000D);

for (int key : sharedMap.keySet()) {
System.out.println ("Key: " + key + " val: " + sharedMap.get(key));
}
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post