📜  门| GATE CS 2018 |简体中文问题21(1)

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

门 | GATE CS 2018 |简体中文问题21

本篇题目为 GATE CS 2018 年考题,是一道关于多线程编程的问题。

问题描述

以下为问题正文:

public class TestSynchronized implements Runnable {
    int x;

    public static void main(String[] args) {
        TestSynchronized run = new TestSynchronized();
        Thread t1 = new Thread(run);
        Thread t2 = new Thread(run);
        t1.start();
        t2.start();
    }

    @Override
    public synchronized void run() {
        x = 0;
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + (++x));
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}

请问上述程序的运行结果是什么?

问题分析

首先,我们需要简要介绍一下程序的功能和结构:这是一个使用多线程编写的 Java 程序,它包含一个 TestSynchronized 类,该类实现了 Runnable 接口并覆写了 run() 方法,同时还有一个 main() 方法则是程序入口。

在主函数里,我们创建了两个线程 t1t2,并将它们都赋值为 run 对象的线程。接下来,我们调用了这两个线程的 start() 方法,这样就开始了程序的多线程运行。

当我们调用 run() 方法时,我们进入了一个 synchronized 代码块。这段代码使用了类的内部锁,确保了每次只有一个线程可以进入临界区执行代码,从而保证了线程安全。

run() 方法里,我们使用一个 for 循环打印了 5 次线程运行时 x 的值,这个值每次加一。为了让运行体现得更清楚,我们使用了 Thread.sleep() 方法来让线程暂停 100 毫秒。

运行结果

由于我们使用了 synchronized,所以线程并发执行时,只有一个线程可以占用临界资源,另一个线程则需要等待,等上一个线程执行完后才能继续执行。根据这个特性,我们可以分析出此程序的运行结果:

Thread-0:1
Thread-0:2
Thread-0:3
Thread-0:4
Thread-0:5
Thread-1:1
Thread-1:2
Thread-1:3
Thread-1:4
Thread-1:5

这就是程序的运行结果:两个线程依次打印值递增的数字 1 到 5。

总结

本题考查了多线程编程。通过使用 synchronized 和内部锁,我们实现了对共享变量 x 的线程安全访问。在使用多线程编程时,我们需要注意线程之间的并发、同步和互斥,防止因为线程误操作而导致程序出现问题。