You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java同步线程实现疑问:代码部分逻辑无法理解

嘿,我来帮你理清楚这里的问题~首先看你现在的代码,其实根本没创建任何线程,更别说同步线程了,先拆解下你现有代码的逻辑,再一步步教你实现同步多线程的需求。

先分析你当前的代码问题

首先看你的代码:

class question3 { 
    public static void main(String arg[]) throws Exception { 
        for (int i = 0; i < 11; i++) { 
            data di = new data(); 
            System.out.println(di.count); 
        } 
    } 
} 
class item { 
    static int count = 0; 
} 
class data extends item {}

这里有几个核心点需要明确:

  • 你只是在单线程的循环里创建了11个data对象,然后打印count,没有任何线程创建和启动的逻辑,本质就是普通的单线程执行流程。
  • item类里的count是static修饰的,这意味着这个变量属于item类本身,而不是每个data实例。所有data对象共享同一个count值,不过你现在没对它做修改,所以每次打印都是初始值0。
如何实现同步的10个线程

如果你想创建10个线程,并且让它们安全地操作共享数据(比如修改同一个count),我们可以分步骤来实现:

1. 定义共享数据类

首先需要一个存储共享数据的类,里面包含要操作的变量,以及同步的方法/代码块来保证线程安全:

class SharedData {
    private int count = 0;

    // 同步方法:同一时间只有一个线程能执行这个方法
    public synchronized void increment() {
        count++;
        // 打印线程操作信息,方便观察执行顺序
        System.out.println("线程" + Thread.currentThread().getName() + "修改后count:" + count);
    }

    public int getCount() {
        return count;
    }
}

这里用synchronized修饰方法,保证同一时刻只有一个线程能进入这个方法,避免多个线程同时修改count导致的计数不准等线程安全问题。

2. 创建线程任务(实现Runnable)

我们用Runnable接口来定义线程要执行的任务,每个线程都会操作同一个SharedData对象:

class MyRunnable implements Runnable {
    private SharedData sharedData;

    // 通过构造方法传入共享数据对象,让所有线程共享同一个实例
    public MyRunnable(SharedData sharedData) {
        this.sharedData = sharedData;
    }

    @Override
    public void run() {
        // 每个线程执行1次计数增加(你可以根据需求修改执行次数)
        sharedData.increment();
    }
}

3. 主方法中创建并启动10个线程

现在在main方法里创建共享数据对象,然后创建10个线程,启动它们,最后等待所有线程完成后打印最终结果:

public class SyncThreadsDemo {
    public static void main(String[] args) throws InterruptedException {
        SharedData sharedData = new SharedData();

        // 创建10个线程数组
        Thread[] threads = new Thread[10];
        for (int i = 0; i < 10; i++) {
            threads[i] = new Thread(new MyRunnable(sharedData), "Thread-" + (i+1));
            threads[i].start(); // 启动线程(这才是真正开启新线程执行任务)
        }

        // 等待所有线程执行完成,避免主线程提前结束
        for (Thread thread : threads) {
            thread.join();
        }

        // 打印最终的count值
        System.out.println("所有线程执行完成,最终count:" + sharedData.getCount());
    }
}
关键知识点解释
  • 线程创建:通过Thread类包装Runnable任务,调用start()方法才会真正启动新线程(注意不要直接调用run(),那只是普通的方法调用,不会开启新线程)。
  • 共享数据:所有线程必须操作同一个SharedData实例,否则每个线程各自持有一份数据,就达不到多线程协作的目的。
  • 同步机制:synchronized关键字保证了同一时间只有一个线程能执行被修饰的方法/代码块,从根源上避免了多线程同时操作共享数据导致的错误。

内容的提问来源于stack exchange,提问作者Dixon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:45:46