我有4个线程同时运行,尝试访问同一类的四个不同方法。 我想知道线程执行的顺序。
public void method1();
public static void method2();
public synchronized void method3();
public static synchronized method4();
方法1由T1调用 method2由T2调用 method3由T3调用 method4由T4调用
以上所有方法属于同一类。 我对完成哪个订单线程感到困惑。 请求你的帮助。
答案 0 :(得分:3)
线程将半并行运行。如果不同步它们,它们可以按任意顺序运行。
您在示例中提供的同步方法不会相互影响。前2个完全没有同步, Object 实例上的第三个同步, Class 上的第四个同步。因此,四个线程可以按任何特定顺序运行。
答案 1 :(得分:1)
答案 2 :(得分:1)
预测线程订单是完全不可能的。这是JVM的全部责任,而不是程序员,并且没有基本法则。
同步对此没有任何帮助。它只是允许确保原子性和内存障碍。
由于这个事实,最着名的“问题”可能是:Race Condition控制程序员对线程的决定很敏感。
答案 3 :(得分:0)
没有办法知道这一点。所有线程根据系统中的CPU /核心数量,系统的优先级以及整个系统的负载同时运行。因此,主要是哪个线程有机会执行某些代码是偶然的。
线程调度程序看似随意的特性也使得调试竞争条件,活锁和死锁对开发人员来说非常“有趣”。当你没有使用(足够的)同步机制时,没有办法可靠地预测操作系统如何执行你的代码。
答案 4 :(得分:0)
线程执行的顺序取决于多种因素,所以真正的问题是你想要执行什么顺序,以及在什么条件下该顺序会发生变化?< / p>
一旦你完成了这项工作,就可以强制一个线程等待或阻止另一个线程,直到它完成为止。这是大多数语言/环境中最常用的线程编程方法。