public class Mythread extends Thread{
    Parenthesis p = new Parenthesis();
    String s1;
    Mythread(String s){
        s1 = s;
    }
    public void run(){
        p.display(s1);
    }
    public static void main(String[] args) {
        Mythread t1 = new Mythread("Atul");
        Mythread t2 = new Mythread("Chauhan");
        Mythread t3 = new Mythread("Jaikant");
        t1.start();
        t2.start();
        t3.start();

    }

}

class Parenthesis{
    public void display(String str){
        synchronized (str) {
            System.out.print("("+str);
            try {
                Thread.sleep(1000);
                //System.out.print("("+Thread.currentThread().getName());
            } catch (Exception e) {
                System.out.println(e);
            }
            System.out.print(")");
        }


}
}


我正在得到类似(Atul(Chauhan(Jaikant)))的输出。据我所知,每个线程的对象都有自己的括号对象的副本,这就是为什么要获得类似(Atul(Chauhan(Jaikant)))这样的输出的原因。所以即使同步display()方法也不会产生类似(Atul)(Chauhan)(Jaikant)的结果)。因此,如果我想要所需的输出,则必须进行同步的static display()方法。如果我不愿意纠正我。

最佳答案

如果要输出类似(Atul)(Chauhan)(Jaikant)的输出,则需要所有线程在同一个对象上进行同步。

例:

class Parenthesis{
    static final String syncObject = "Whatever";

    public void display(String str){
        synchronized (syncObject) {
            System.out.print("("+str);
            try {
                Thread.sleep(1000);
                //System.out.print("("+Thread.currentThread().getName());
            } catch (Exception e) {
                System.out.println(e);
            }
            System.out.print(")");
        }
    }
}

10-07 16:35