简单的setter和getter需不需要synchronized

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

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

class Abc {
private String name;
public synchronized String getName() { return name;}
public synchronized void setName(String name) { this.name = name;}
}


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

2. 在上一个例子中,在该类内部访问name属性时,是直接访问,还是通过getter和setter访问?

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");}
}
}


如果getName()与setName()加了synchronized的,是不是内部都应该使用getter/setter来访问name?否则getName()/setName()的synchronized加了就没有什么用了
...全文
249 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
our651 2008-07-09
  • 打赏
  • 举报
回复
这个列子比较常见,如果

1>不加synchronized
两个线程可以同时访问geter,和seter
这样就可能一个线程set值的时候,另一个在get,你无法知道,这个时候你取得的值是set前的,还是set后的

2>加了synchronized
两个线程同时只能访问geter或者seter,可以确保得到正确的值

PS:实际加synchronized这个关键字,我们是在保护private String name这个变量
是在确保同时只有一个线程在访问它,所以所有对它进行了操作的方法都应该加上
synchronized
lovingprince 2008-07-09
  • 打赏
  • 举报
回复
对于第一个问题,假设你不加锁,可能会这样,一个线程A高高兴兴的调用getname()方法准备获取名字的时候,这个时候假设name=“你” ,这个方法还没返回,此时,另一个线程B就调用了setName()将名字给改成了“我”,那线程A屁颠屁颠的还以为他拿到"你"了呢,结果他拿到的时候“我”。明白了吧
huangyangweiyue 2008-07-09
  • 打赏
  • 举报
回复
关注中~~
dddeee 2008-07-09
  • 打赏
  • 举报
回复
会有多个线程同时访问同一个对象.我的疑问就是,对于问题一,如果没有加synchronized,会有怎么样的后果呢?能否举例说明
lovingprince 2008-07-09
  • 打赏
  • 举报
回复
需不需要锁,是看你是否会有多个线程同时访问同一个对象,如果没有,那么加锁是没有必要的,如果有的话,那么就必须加锁保持数据同步。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧