键:0 val:250000000
键:1 val:250000000
只是启动内部键:2 Val:250000000
键:3 Val:250000000
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<Integer, Integer> map; int threadId; public static int NUM_ITERATIONS = 1000000; ReadUpdateWrite(Map<Integer, Integer> 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<Integer, Integer> sharedMap = new HashMap<Integer, Integer>(); // 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)); } } }
我的恭喜:您已经编写了线程安全代码,因为
Thread.run()
Runnable.run
,因此您依次调用所有操作。使用this this是:
:
Thread.run()