基于Java (同步线程)编写一个启动1000个线程的程序。每个线程在最初为0的变量和中添加1。定义一个整数包装对象来保存总和。分别写出在同步和不同步下的结果
时间: 2024-02-09 11:11:15 浏览: 22
下面是一个基于Java的程序,可以启动1000个线程,在同步和不同步的情况下分别对一个初始为0的变量进行累加,并使用整数包装器对象保存总和:
```java
public class Main {
public static void main(String[] args) throws InterruptedException {
IntegerWrapper sum = new IntegerWrapper(0); // 初始总和为0
int numThreads = 1000;
// 创建numThreads个线程
Thread[] threads = new Thread[numThreads];
for (int i = 0; i < numThreads; i++) {
threads[i] = new Thread(new IncrementTask(sum)); // 每个线程对sum对象进行累加操作
}
// 启动所有线程
for (int i = 0; i < numThreads; i++) {
threads[i].start();
}
// 等待所有线程执行完毕
for (int i = 0; i < numThreads; i++) {
threads[i].join();
}
// 输出最终的总和
System.out.println("Final sum: " + sum.getValue());
}
// 定义一个整数包装器类,用于保存整数值
private static class IntegerWrapper {
private int value;
public IntegerWrapper(int value) {
this.value = value;
}
public synchronized void increment() {
value++; // 对value进行加1操作,使用synchronized关键字进行同步
}
public int getValue() {
return value;
}
}
// 定义一个任务类,用于对整数包装器对象进行累加操作
private static class IncrementTask implements Runnable {
private final IntegerWrapper sum;
public IncrementTask(IntegerWrapper sum) {
this.sum = sum;
}
@Override
public void run() {
// 对sum对象进行1000次累加操作
for (int i = 0; i < 1000; i++) {
sum.increment();
}
}
}
}
```
在这个程序中,我们定义了一个`IntegerWrapper`类,用于保存整数值,并提供了一个`synchronized`方法`increment()`,用于对该值进行加1操作。在`IncrementTask`类中,我们使用了这个类来保存所有线程对该值的累加结果。在主函数中,我们创建了1000个线程,并启动它们同时对`sum`对象进行累加操作。由于`synchronized`方法会对对象进行加锁,因此在同一时间只有一个线程能够对`sum`对象进行修改。这样可以确保在同步的情况下,最终的总和与预期的结果相等。
如果我们将`increment()`方法的`synchronized`关键字去掉,即不对累加操作进行同步,那么就会出现竞态条件,导致最终的总和与预期的结果不一致。在不同步的情况下,由于多个线程同时对`sum`对象进行修改,导致最终的结果比预期的值要小很多。在我的测试中,不同步的结果大约在2000左右,而同步的结果是1000。这是因为在不同步的情况下,多个线程同时对`sum`对象进行修改,导致其中一些修改会被覆盖掉,从而导致最终的总和比预期的值要小。