您应该同步Java中的属性访问吗?

Nux*_*Nux 7 java spring multithreading synchronized

我最近偶然发现了一篇题为" 同步访问可变字段 "的文章.它声称:

例如,在多线程环境中,可变字段的all getset方法通常应该是synchronized方法.这包括原始字段.

我的问题是为什么?同步getId方法有什么用?或者如果我不同步它会发生什么.

例如,我传递UserContext给Spring Service函数并getUserId在函数内调用.如果getUserId不同步,这可能是一个问题吗?

KM5*_*529 1

Synchronized 指定对变量的任何访问一次仅限于一个线程。所以在功能完成的过程中它会加锁,防止别人修改它。您可以在此处查看更多详细信息以及相关官方文档:“同步”是什么意思?

至于可能发生的情况,有一个相当简单的示例,但不使用 ID,因为这不应该改变。假设您有一个名为“cost”的属性(名称无关),其值为 10,并且有两个线程可以访问该属性并且同时运行。

进程不同步:

流程 A - 调用将成本更改为 20。

流程 B - 调用获取成本

流程 B - 获取成本 = 10

流程 A - 完成成本修改。

因此,即使线程 A 更改它的成本为 20,但在 B 检索其值之前该属性并未更新,从而导致接收到错误的信息。