public class Fern extends Thread
{
    private String x = "varun";

    public void run()
    {
         synchronized(Fern.class){

        System.out.println(x);
        try {
            sleep(5);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        x = "Anku";
        }
    }
    public static void main(String args[]) throws Exception
    {
        Fern f = new Fern();
        Thread t1 = new Thread(new Fern());
        Thread t2 = new Thread(new Fern());
        t1.start();
        t2.start();
    }
}


输出为:
瓦伦
瓦伦

由于该块已在Fern.class上同步,因此一次只能允许一个线程进入该块,而不管它属于哪个实例,因为所有实例的类都只有一个锁。如果用单个Fern对象替换Thread构造函数中的new Fern(),则输出为:
瓦伦
安库
行为就是如果我对此进行同步会发生什么。
自从我同步以来,我不明白为什么会这样

最佳答案

x不是static变量。将其更改为static


  静态字符串x =“ varun”;




编辑:
或将与参数相同的对象传递给t1t2

Fern f = new Fern();
Thread t1 = new Thread(f); // pass the same object
Thread t2 = new Thread(f);

10-08 09:13