对不起这个问题((我刚刚陷入困境)(( 我需要测试10个线程写入相同的哈希(真的不是哈希,但非常类似的东西,我需要证明它同步写入) 这是正确的代码吗?
Random rn = new Random();
Map<int,int> hash = new MyHashMap<int,int>();
for(int i = 0; i< 10; i++)
{
Thread th = new MyAddingThread();
th.Start();
}
public class MyAddingThread extends Thread{
public void run()
{
hash.Add(rn.nextInt,rn.nextInt);
}
}
将10更改为100可能会更好。但我不知道如何测试数据哈希以进行同步(
答案 0 :(得分:4)
HashMap
不是线程安全的。请改用ConcurrentHashMap
。
修改强>
如果您真正的问题是您的代码是否允许您测试任何给定的数据结构是否是线程安全的,那么实际上没有可靠的方法。多线程开发可能会引入任何非常难以检测的错误。数据结构要么是线程安全的,要么不是。
答案 1 :(得分:1)
这不起作用,因为所有线程都应该尝试同时将项添加到哈希值。
为此,您需要使用CountDownLatch
[[main]]
CountDownLatch startSignal = new CountDownLatch(1);
for(int i = 0; i< 10; i++)
{
Thread th = new MyAddingThread();
th.Start();
}
startSignal.countdown();
[[on the thread]]
public class MyAddingThread extends Thread{
public void run()
{
startSignal.await();
hash.Add(rn.nextInt,rn.nextInt);
}
}
这个类的javadoc有一个类似(但更复杂)的例子。
此外,如果要正确测试,请在计算机中创建与内核相同数量的线程,并且每个线程应执行循环并至少插入几百个项目。如果你试图只插入10个元素,那么你几乎没有机会遇到并发问题。
答案 2 :(得分:1)
HashMap
未已同步,因此您必须自行完成!
您可以同步访问权限:
public class MyAddingThread extends Thread {
public void run() {
synchronized(hash) {
hash.put(rn.nextInt(),rn.nextInt());
}
}
}
但是你错过了大部分并发执行。
另一个想法是使用ConcurrentHashMap
:
ConcurrentMap<Integer,Integer> hash = new ConcurrentHashMap<>();
public class MyAddingThread extends Thread {
public void run() {
hash.put(rn.nextInt(),rn.nextInt());
}
}
由于阻塞代码较少,这将提供更高的性能。
另一个问题是在这里使用Random
这是线程安全的,但也会导致性能不佳。
哪种解决方案最适合您的问题我无法从您的小伪代码中考虑。