为什么我在此Java代码中进行读书时没有比赛条件? [重复]

问题描述 投票:0回答:1
,经过多次试验,我看到这些值总是250m,因此不会丢失更新。 FWIW,我正在编写此玩具应用程序,以将其与使用Collections.SynchronizedMap进行比较,但是,我需要此应用程序失败(显示竞赛条件),但是它似乎总是会产生一个不及格的结果。
Work进行了:39.496

键: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
,因此您依次调用所有操作。使用
java multithreading runnable race-condition
1个回答
1
投票
INSTEAD:

this this是:

Thread.run()
	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.