📌  相关文章
📜  教资会网络 | NTA UGC NET 2019 年 6 月 – II |问题 6(1)

📅  最后修改于: 2023-12-03 15:39:53.935000             🧑  作者: Mango

教资会网络 | NTA UGC NET 2019 年 6 月 – II | 问题 6

本题旨在考察考生对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关键字,这意味着可能会在多个线程同时访问该方法时发生数据竞争,导致返回的结果不准确。因此,需要根据实际场景决定是否需要在该方法中加入同步措施。