📅  最后修改于: 2023-12-03 15:12:36.610000             🧑  作者: Mango
本篇题目为 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()
方法则是程序入口。
在主函数里,我们创建了两个线程 t1
和 t2
,并将它们都赋值为 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
的线程安全访问。在使用多线程编程时,我们需要注意线程之间的并发、同步和互斥,防止因为线程误操作而导致程序出现问题。