dddeee 2008-07-09 10:01
浏览 237
已采纳

简单的setter和getter需不需要synchronized

一直对synchronized和锁的理解不太好,在网上看了很多资料,还是没有解决疑惑. 请教大家:

  1. 简单的setter和getter方法需不需要加锁?

[code="java"]
class Abc {
private String name;
public synchronized String getName() { return name;}
public synchronized void setName(String name) { this.name = name;}
}
[/code]

我始终不太明白,这两个synchronized在这里有什么好处.我只看到一篇文章上说,如果不加,"会引起数据混乱".可是为什么会混乱?我觉得"return name"和"this.name=name"这两个操作本身就是原子的(?),加不加synchronized应该都一样啊.

  1. 在上一个例子中,在该类内部访问name属性时,是直接访问,还是通过getter和setter访问? [code="java"] class Abc { private String name; public synchronized String getName() { return name;} public synchronized void setName(String name) { this.name = name;} private void m1() { if(name.equals("sdf")) { name = "123";}
    if(getName().equals("sdf")) { setName("123");} } } [/code] 如果getName()与setName()加了synchronized的,是不是内部都应该使用getter/setter来访问name?否则getName()/setName()的synchronized加了就没有什么用了 [b]问题补充:[/b] 刚才在网上查到一段资料: "在java中,32位或者更少位数的赋值是原子的。在一个32位的硬件平台上,除了double和long型的其它原始类型通常都是使用32位进行表示,而double和long通常使用64位表示。另外,对象引用使用本机指针实现,通常也是32位的。对这些32位的类型的操作是原子的"

说明对象引用的赋值的确是原子的

  • 写回答

1条回答 默认 最新

  • iteye_14447 2008-07-09 10:45
    关注

    是否同步,取决于你的“资源”是否需要共享(多线程同时读或写)。
    java里long型赋值都不是原子的,句柄也是。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 matlab中使用gurobi时报错
  • ¥15 WPF 大屏看板表格背景图片设置
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂