java - 多线程同步问题

标签 java multithreading synchronization

我对学校的线程练习有疑问,我们只是在学习线程/同步,我有点迷茫。

基本上我想启动某个类的4个线程。每个线程将运行 25 次并打印出数字 1---100。

输出应该是这样的

线程 1: 1

线程 3:2

线程 4:3

线程 2:4

.

.

.

.

线程 3:100

但是实际打印出来的是这样的。它很重要,但没有正确吐出数字。

线程 1: 1

线程 3:1

线程 4:5

线程 2:6

线程 3:7

线程 3:8

线程 1:9

线程 2:10

线程 4:10

.

.

.

.

线程 3:100

这是我正在线程化的类的代码

public class numberentrycreater implements Runnable
{
    final private int max = 100;
    private static int count = 1;
    private String createdBy;
    private SharedBuffer buffer;

    public numberentrycreater(String createdBy ){
        this.createdBy = createdBy;
    }

    public synchronized void  increment(NumberEntry ne){
        System.out.println(ne.getCreatedBy()+": " + ne.getValue());
        if(count<=max){
            count++;
        }
    }

    @Override
    public  void run()
    {
        for(int i=0; i<25; i++){
            if(count<=max){
                NumberEntry ne = new NumberEntry(count,createdBy);
                increment(ne);
                try
                {
                    Thread.sleep(100);
                } catch (InterruptedException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}

我认为问题在于 NumberEntry 对象的创建。但我不太确定如何解决它。如果有人能以任何方式帮助我,那就太好了:)。

最佳答案

这里的同步有点乱,你会遇到很多竞争条件。

首先,您要创建 NumberEntry在你进入同步方法之前,所以没有理由认为多个线程不会选择相同的数字。

另外,synchronized 方法实际上不会被同步。 synchronized作为方法选项只是 synchronized(this) { ... } 的简写, 和 this在这种情况下是可运行的,每个线程都是唯一的,所以它们可以同时进入它。您需要同步他们共享的内容。尝试在 synchronized(numberentrycreater.class) { <method code> } 的方法中放置一个 block 相反。

编辑:

ControlAltDel 建议使用 next()同步方法而不是 increment更优雅,更不容易出问题。不过,它仍然存在同步错误的问题(在撰写本文时)。

关于java - 多线程同步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32638571/

相关文章:

java - 旧版本的 java 中 HttpServletRequest.getServletContext() 的等价物是什么?

java - Singleton 类中的方法是线程安全的吗?

Java传递值

c# - 这是使用 System.Threading.Timer 运行计划的异步/等待方法的正确方法吗?

java - Firebase 同步如何与共享数据一起工作?

java - SQL 数据库 (JDBC) : A column of type date only stores date values and not time values

c# - 同时运行给定数量的相同进程

java - Simpledate 的线程安全代码

java - 我可以调用同步方法来调用非同步方法,而非同步方法又调用同步方法吗?

c# - 等待任何线程完成,而不是全部