【问题标题】:Multiple thread without using Synchronized多线程不使用同步
【发布时间】: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 构造函数采用RunnablePrintingJob 实现,String,成为线程名称。由于PrintingJob实现了Runnable,它有一个run()方法供其他类调用。
  • 您只使用 synchronized 来保护数据,并确保更改在线程间可见。您的示例并不能真正保证同步的用户。

标签: java multithreading synchronized


【解决方案1】:

有一个只显示来自第 N 个索引的值的方法。 'N' 将是静态字段级变量。

拥有一个带有“run”方法的线程,该方法永远运行并执行以下操作。 1) 在索引“n”中打印值。 2) 增加 N。 3) 如果 N > 列表大小,则 'break'。 让“N”为“原子整数”。

在 main 方法中有两个线程并启动它们。让您的列表中包含大约 100 个值,以便您可以看到两个线程选择值。

但是,这不是线程安全的,两个线程可以获得相同的 'N' 值。

祝你好运。

【讨论】:

    猜你喜欢
    • 2012-11-22
    • 1970-01-01
    • 2021-10-25
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 2011-12-28
    相关资源
    最近更新 更多