java - 在多线程中的java中工作的同步块
问题描述
我有一个关于 post Synchronized block not working的问题,下面的代码正在打印“Hello Java”……。obj1 和 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();
}
}
推荐阅读
- python - 使用 pip 从本地文件系统文件夹安装 Python 包
- oracle - 尝试建立一个触发器,在每次更新后计算行数
- sip - sip:防止INVITE请求信息欺骗
- python - 如何将一个数组复制/重复 N 次到一个新数组中?
- python - python pjsip如何识别receiver已断开呼叫
- javascript - 设置状态不适用于图像源
- angularjs - AngularJS:错误:预期未定义要定义
- scala - EventTime 窗口未触发
- javascript - 从同一个模块多次导入有什么影响?
- ruby-on-rails - rails will_save_change_to 奇怪的行为