我已经声明为同步的保护方法,但是它给出的输出似乎是该方法未同步

时间:2019-02-21 13:20:15

标签: java synchronized

我认为输出将是

lol(0) lol(1) lol(2) lol(3) lol(4) lol(5) lol(6) lol(7) lol(8) lol(9) LOL(0) 
LOL(1) LOL(2) LOL(3) LOL(4) LOL(5) LOL(6) LOL(7) LOL(8) LOL(9)

因为我已经同步了保护方法

但是输出来了

lol(0) LOL(0) lol(1) LOL(1) LOL(2) lol(2) LOL(3) lol(3) lol(4) LOL(4) lol(5) 
LOL(5) LOL(6) lol(6) lol(7) LOL(7) lol(8) LOL(8) LOL(9) lol(9)

为什么会这样?

ThreadBare类:

class ThreadBare implements Runnable
{ 

    String msg;
    ThreadBare(String m)
    {
        msg=m;
    }

     public  synchronized  void  protect()  //synchronized
    {
        for(int i=0;i<10;i++)
        {
            System.out.print(" "+msg+"("+i+")");
            try
            {
                Thread.sleep(1000);
            }
            catch(InterruptedException ie)
            {
                System.out.println(ie);
            }
        }
    }

     public void run()
    {
        protect();
    }
}

MainBare类:

class MainBare
{

    public static void main(String args[ ] )
    {
        Thread t1=new Thread(new ThreadBare("lol"));

        Thread t2=new Thread(new ThreadBare("LOL"));

        t1.start();
        t2.start();

    }
}

1 个答案:

答案 0 :(得分:1)

您可以在https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html下阅读,在方法上使用synchronize关键字将仅同步该对象的方法调用。由于您创建了两个对象t1t2,因此它们不会彼此同步。

您可以通过使用受保护的方法(作为对t1t2的引用传递的受保护方法,使用t1t2来创建单个对象,然后调用{ {1}}。

或者,您可以将thatObject.protect()重构为静态,在这种情况下,同步将是全类的。

说明:

在方法上使用protect()关键字将在内部使用synchronize / class实例进行同步。相反,在静态方法上使用this会使用synchronize实例进行同步,从而使其跨不同的对象实例工作。