1

我有 4 个线程同时运行,试图访问同一类的以下四种不同方法。我想知道线程将按什么顺序执行。

public void method1();
public static void method2(); 
public synchronized void method3();
public static synchronized method4();

method1 被 T1 调用 method2 被 T2 调用 method3 被 T3 调用 method4 被 T4 调用

以上所有方法都在同一个类中。我对将运行哪个顺序线程完全感到困惑。请求您的帮助。

4

5 回答 5

3

线程将半并行运行。如果您不同步它们,它们可以以任意顺序运行。

您在示例中提供的同步方法不会相互影响。第一个 2 根本没有同步,第三个在Object实例上同步,第四个在Class上同步。因此,四个线程可以以任何特定的顺序运行。

于 2013-04-18T10:35:06.333 回答
1

完全不可能预测线程顺序。这是 JVM 的全部责任,而不是程序员,并且没有基本规律。

同步对此毫无帮助。它只是允许确保原子性和内存屏障。

由于这个事实,最知名的“问题”可能是:竞争条件控制程序员对线程的决定很棘手。

于 2013-04-18T10:42:43.637 回答
1

需要同步。按照此链接进行同步:http ://www.tutorialspoint.com/java/java_thread_synchronization.htm

于 2013-04-18T10:37:08.793 回答
0

线程将执行的顺序将取决于多种因素,所以真正的问题是您希望它们以什么顺序执行,以及在什么条件下该顺序会改变?

一旦你解决了这个问题,你可以强制一个线程等待或阻塞另一个线程,直到它完成。这是大多数语言/环境中线程编程的最常见方法。

于 2013-04-18T10:39:03.680 回答
0

没有办法知道这一点。所有线程根据系统中 CPU/内核的数量、系统的优先级以及整个系统的负载同时运行。因此,主要是哪个线程有机会执行某些代码是一个机会问题。

线程调度程序看似随意的性质也是调试竞争条件、活锁和死锁对开发人员如此“有趣”的原因。当您不使用(足够的)同步机制时,无法可靠地预测操作系统如何执行您的代码。

于 2013-04-18T10:35:55.183 回答