synchronized java thread错误输出序列

时间:2014-03-29 13:59:46

标签: java multithreading synchronization

Hy,我尝试按照http://www.studytonight.com/java/synchronization.php

进行操作

这是我的代码

class First {
     public void display(String msg)   
     {
         System.out.print("["+msg);
         try {
             Thread.sleep(1000);
         } catch (InterruptedException ex) {}
         System.out.println("]");
     }
}

class Second extends Thread{
    String msg;
    First fobj;

    Second(First fp,String str){
        msg=str;
        fobj=fp;
        start();
    }

    public void run(){
        synchronized(fobj){
            fobj.display(msg);
        }
    } 
}

public class Main {

    public static void main(String[] args) {
        // TODO code application logic here
        First f=new First();
        Second s1=new Second(f,"welcome");
        Second s2=new Second(f,"new");
        Second s3=new Second(f,"programmer");
    }

}

这是我的结果

run:
[welcome]
[programmer]
[new]
BUILD SUCCESSFUL (total time: 3 seconds)

我的代码出了什么问题?为什么结果不欢迎新程序员?

1 个答案:

答案 0 :(得分:3)

所有线程几乎同时启动,并相互竞争以获取对共享对象的锁定。

无法保证第二个线程在第三个线程之前请求锁定。即使是这种情况,锁定也不公平,因此无法保证等待锁定的第一个线程将首先获得它。

使用上述代码的唯一保证是,一次只有一个线程能够执行同步方法。