保护方法我声明为同步但它给出的输出似乎是方法不同步[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我以为输出会是

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();

    }
}
java synchronized
1个回答
1
投票

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

您可以通过使用受保护的方法创建一个对象来解决这个问题,该方法作为对t1t2的引用传递,然后使用t1t2调用thatObject.protect()

或者,您可以将protect()重构为静态,在这种情况下,同步将在类范围内。

说明:

在方法上使用synchronize关键字将在内部使用this / classes实例进行同步。在静态方法上使用synchronize将改为使用Class实例进行同步,使其在不同的对象实例中工作。

© www.soinside.com 2019 - 2024. All rights reserved.