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
相关产品推荐
相关产品推荐

