在多线程中 java 工作的同步块
Synchronized block working in java in multithreading
我有一个关于 post Synchronized block not working 的问题,下面的代码正在打印“你好 Java” ...... obj1 和 obj2 的 20 次。此代码类似于 post.
中给出的代码
根据解释,下面的代码不应该也有不同的输出吗?有人可以帮助我了解两者之间的区别吗?
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();
}
}
您正在获取调用 运行() 方法的 ThreadDemo 实例的锁。由于两个线程都使用同一个对象,因此 Synchronized 块在这里工作。
您只打印 x
和 y
,它们位于 synchronized
块中,因此它打印相同的值。在 print 中添加 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();
}
}
我有一个关于 post Synchronized block not working 的问题,下面的代码正在打印“你好 Java” ...... obj1 和 obj2 的 20 次。此代码类似于 post.
中给出的代码根据解释,下面的代码不应该也有不同的输出吗?有人可以帮助我了解两者之间的区别吗?
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();
}
}
您正在获取调用 运行() 方法的 ThreadDemo 实例的锁。由于两个线程都使用同一个对象,因此 Synchronized 块在这里工作。
您只打印 x
和 y
,它们位于 synchronized
块中,因此它打印相同的值。在 print 中添加 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();
}
}