我有一个关于帖子的问题 同步块不起作用,以下代码正在打印"你好 Java"....对象 1 和 OBJ2 为 20 次。此代码类似于帖子中给出的代码。
根据解释,以下代码不应该也有不同的输出吗?有人可以帮助我了解两者之间的区别吗?
class ThreadDemo implements Runnable
{
String x, y;
public void run()
{
for(int i = 0; i < 10; i++)
synchronized(this)
{
x = "Hello";
y = "Java";
System.out.print(x + " " + y + " ");
}
}
public static void main(String args[])
{
ThreadDemo run = new ThreadDemo ();
Thread obj1 = new Thread(run);
Thread obj2 = new Thread(run);
obj1.start();
obj2.start();
}
}
您只打印x
和y
synchronized
块,因此打印的值相同。添加i
,这是打印中的外部synchronized
块,您将看到不同的输出。
class ThreadDemo implements Runnable
{
String x, y;
public void run()
{
for(int i = 0; i < 10; i++)
synchronized(this)
{
x = "Hello";
y = "Java";
System.out.println(x + " " + y + " "+i);
}
}
public static void main(String args[])
{
ThreadDemo run = new ThreadDemo ();
Thread obj1 = new Thread(run);
Thread obj2 = new Thread(run);
obj1.start();
obj2.start();
}
}
您正在调用该 run(( 方法的 ThreadDemo 实例上获得一个锁。由于两个线程都使用相同的对象,因此同步块在这里工作。