线程顺序使用synchronized

时间:2017-05-02 09:48:05

标签: java multithreading thread-safety synchronized

当输出不是A / B / BC / AD(/是新行)时是否有任何情况?第二个Thread可能在第一个之前启动吗?

public class JavaApplication6 extends Thread{
final StringBuffer sb1 = new StringBuffer();
final StringBuffer sb2 = new StringBuffer();

public static void main(String[] args) throws InterruptedException {
    final JavaApplication6 h = new JavaApplication6();
    new Thread(){
        public void run(){
            synchronized(this){
                h.sb1.append("A");
                h.sb2.append("B");
                System.out.println(h.sb1);
                System.out.println(h.sb2);
            }
        }
    }.start();
    new Thread(){
        public void run(){
            synchronized(this){
                h.sb1.append("D");
                h.sb2.append("C");
                System.out.println(h.sb2);
                System.out.println(h.sb1);
            }
        }
    }.start();           
}}    

2 个答案:

答案 0 :(得分:0)

是的,第二个线程可以在第一个之前启动。

这可能是因为线程调度程序以不可预测的方式启动线程。

此外:首先可以先启动,但最后完成,因为线程之间的切换(由提到的线程调度程序做出)。

即使您多次运行此应用并“证明”订单相同,也无法保证此订单不会在下次运行时发生变化。

答案 1 :(得分:0)

是的,第二个线程可以在第一个线程之前启动。 它完全取决于线程调度程序。一旦创建了线程,它们就会转移到可运行状态,然后它就是线程调度程序负责执行哪个线程。无法保证首先启动和完成哪个线程。您可以通过在循环中执行此方法来尝试此行为 -

public static void abc() throws InterruptedException {
    final JavaApplication6 h = new JavaApplication6();
    new Thread(){
        public void run(){
            synchronized(this){
              System.out.println("T-10000000000");
            }
        }
    }.start();
    new Thread(){
        public void run(){
            synchronized(this){
              System.out.println("T-2");
            }
        }
    }.start();           
}}

public class JavaApplication61 {
    public static void main(String ar[]) throws InterruptedException{
        for(int i=0; i<100;i++){
            JavaApplication6.abc();
        }
    }

}