我认为输出将是
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();
}
}
答案 0 :(得分:1)
您可以在https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html下阅读,在方法上使用synchronize
关键字将仅同步该对象的方法调用。由于您创建了两个对象t1
和t2
,因此它们不会彼此同步。
您可以通过使用受保护的方法(作为对t1
和t2
的引用传递的受保护方法,使用t1
和t2
来创建单个对象,然后调用{ {1}}。
或者,您可以将thatObject.protect()
重构为静态,在这种情况下,同步将是全类的。
说明:
在方法上使用protect()
关键字将在内部使用synchronize
/ class实例进行同步。相反,在静态方法上使用this
会使用synchronize
实例进行同步,从而使其跨不同的对象实例工作。