Java 线程似乎工作良好,但不应该

Java 线程似乎工作良好,但不应该,java,multithreading,concurrency,Java,Multithreading,Concurrency,我有一个程序,它的任务是证明我的类不是线程安全的,但我得到了很好的结果,但我不能理解为什么 该应用程序基本上将所有工人的工资增加一倍,并使用100个线程执行1000次,因此结果应增加100.000,这是正常的:/ 测试等级: 您没有同时运行这些线程 threads[i].run(); 应该读 threads[i].start(); 实际上,Thread.start会生成该线程。run将只调用Runnable的run方法。从文档: 如果此线程是使用单独的可运行运行对象构建的,

我有一个程序,它的任务是证明我的类不是线程安全的,但我得到了很好的结果,但我不能理解为什么

该应用程序基本上将所有工人的工资增加一倍,并使用100个线程执行1000次,因此结果应增加100.000,这是正常的:/

测试等级:


您没有同时运行这些线程

    threads[i].run();
应该读

    threads[i].start();
实际上,Thread.start会生成该线程。run将只调用Runnable的run方法。从文档:

如果此线程是使用单独的可运行运行对象构建的, 然后调用可运行对象的run方法;否则,这个 方法不执行任何操作并返回


不太清楚为什么会有这种方法。这是一个常见的混淆源。

您没有同时运行这些线程

    threads[i].run();
应该读

    threads[i].start();
实际上,Thread.start会生成该线程。run将只调用Runnable的run方法。从文档:

如果此线程是使用单独的可运行运行对象构建的, 然后调用可运行对象的run方法;否则,这个 方法不执行任何操作并返回


不太清楚为什么会有这种方法。这是一个常见的困惑来源。

1000并不多。当下一个线程开始旋转时,该线程可能正在遍历列表。另外,由于您是按顺序迭代的,如果一个线程甚至比另一个线程稍微落后一点,那么它很可能就赶不上了。要了解竞争情况,我认为你必须让竞争更有可能发生,就像以随机顺序处理工人一样。谢谢Rob,但这不是问题所在:1000并不多。当下一个线程开始旋转时,该线程可能正在遍历列表。另外,由于您是按顺序迭代的,如果一个线程甚至比另一个线程稍微落后一点,那么它很可能就赶不上了。要了解比赛情况,我认为你必须让竞争变得更有可能,就像以随机顺序处理工人一样。谢谢Rob,但这不是问题所在:这才是问题所在!!天哪,我现在真讨厌我自己:太琐碎了。。。我非常感谢你的回答,你给了我一些时间…@czupe-非常常见的错误。我一看到你的问题就怀疑这个问题。我也这么做了…谢谢!很难想象你也会犯错误;尊敬的,这就是问题所在!!天哪,我现在真讨厌我自己:太琐碎了。。。我非常感谢你的回答,你给了我一些时间…@czupe-非常常见的错误。我一看到你的问题就怀疑这个问题。我也这么做了…谢谢!很难想象你也会犯错误;尊敬
    threads[i].start();