【发布时间】:2019-07-11 12:45:46
【问题描述】:
我正在学习我的实验课,多线程。
在多线程中,我知道如果我们使用synchronized 关键字,它永远不会让所有线程同时访问方法,而是将它们放入队列中,让它们一个一个访问。
但我的老师说,使用同步不是一个好习惯(没有时间解释为什么,但会在下节课上问)。
这是我的代码
import java.util.HashMap;
import java.util.Map;
public class Testmultithread {
static String printMe(int inp) {
return Integer.toString(inp);
}
public static void main(String[] args) {
Map<String, Integer> listofval = new HashMap<String, Integer>();
listofval.put("1", 1);
listofval.put("2", 2);
listofval.put("3", 3);
listofval.put("4", 4);
listofval.put("5", 5);
for (Map.Entry<String, Integer> entry : listofval.entrySet()) {
Testmultithread.printMe(entry.getValue());
}
}
}
请问如何在不使用synchronized 关键字的情况下在上述代码中实现多线程(在多线程级别访问printMe 方法的映射条目)...?
请给个建议...!
谢谢
【问题讨论】:
-
查看
java.util.concurrent.Lock了解一种可用于同步线程的机制。有关示例,请参见 this。 -
你可以使用锁吗?如果是这样,就这样做,正如前一个人评论的那样。但是,如果我是你,我会研究处理多线程的不同方式的异同,因为很多人会不同意你的教授所说的你永远不应该使用同步。要阅读的示例帖子:softwareengineering.stackexchange.com/questions/176762/…
-
@AustinSchäfer,检查您的链接,其中提到“thread[i] = new Thread(new PrintingJob(printerQueue), “Thread” + i);",请问 run() 是如何在 PrintingJob 类中被调用 ..?
-
我不确定你在问什么:你的意思是为什么
PrintingJob能够有一个run()方法或者为什么其他类能够调用run()来获得一个@987654331 @?此处使用的Thread构造函数采用Runnable,PrintingJob实现,String,成为线程名称。由于PrintingJob实现了Runnable,它有一个run()方法供其他类调用。 -
您只使用 synchronized 来保护数据,并确保更改在线程间可见。您的示例并不能真正保证同步的用户。
标签: java multithreading synchronized