📅  最后修改于: 2023-12-03 15:39:53.935000             🧑  作者: Mango
本题旨在考察考生对Java程序中线程同步的掌握程度。
在Java中,多个线程可能会同时访问同一个对象中的同步代码块,这时需要用到synchronized关键字来实现线程同步。下面是一个关于线程同步的Java程序:
class Incrementer implements Runnable {
private int counter = 0;
public synchronized void increment() {
counter++;
}
public int getCounter() {
return counter;
}
@Override
public void run() {
for (int i = 0; i < 100000; i++) {
increment();
}
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
Incrementer incrementer = new Incrementer();
Thread t1 = new Thread(incrementer);
Thread t2 = new Thread(incrementer);
Thread t3 = new Thread(incrementer);
Thread t4 = new Thread(incrementer);
t1.start();
t2.start();
t3.start();
t4.start();
t1.join();
t2.join();
t3.join();
t4.join();
System.out.println(incrementer.getCounter());
}
}
请问,以上程序的输出结果是什么?
A. 1000000
B. 250000
C. 500000
D. 无法确定
A. 1000000
以上程序的输出结果为1000000,原因是在Incrementer类的increment方法中使用了synchronized关键字,这意味着在同一时刻只有一个线程可以访问该方法,从而保证了counter变量在多个线程中的原子性。
在main方法中,创建了4个线程对同一个Incrementer对象进行操作,由于increment方法是同步的,因此多个线程之间不会干扰counter变量的更新,最终输出结果为1000000。
值得注意的是,在Incrementer类的getCounter方法中没有使用synchronized关键字,这意味着可能会在多个线程同时访问该方法时发生数据竞争,导致返回的结果不准确。因此,需要根据实际场景决定是否需要在该方法中加入同步措施。