这个问题在这里已有答案:
我以为输出会是
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();
}
}
正如您可以在https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html下阅读,在方法上使用synchronize
关键字将仅同步该对象的方法调用。由于您创建了两个对象t1
和t2
,因此它们不会相互同步。
您可以通过使用受保护的方法创建一个对象来解决这个问题,该方法作为对t1
和t2
的引用传递,然后使用t1
和t2
调用thatObject.protect()
。
或者,您可以将protect()
重构为静态,在这种情况下,同步将在类范围内。
说明:
在方法上使用synchronize
关键字将在内部使用this
/ classes实例进行同步。在静态方法上使用synchronize
将改为使用Class
实例进行同步,使其在不同的对象实例中工作。