一直对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加了就没有什么用了
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加了就没有什么用了
解决方案 »
- 输出的结果很乱,不知道是什么原因,请各位帮忙!
- FileInputStream read
- 高手们!能先回答我一个愚蠢的问题吗?
- java 求解 !急!!!!!!!
- 200元RMB 求JAVA国际化 编码问题 UTF-8 在线等。。急死了求求大哥大姐帮帮我吧
- 100分求问/回答即给分
- 多线程,锁的检测问题,有请高手,up有分!
- java递归的格式问题
- jsp页面提交后,要让服务器去处理逻辑,而IE能够继续做其他的界面操作,这能实现吗?
- 请问 Java 里面有生成 Excel 文件的类吗?
- 连接sql server的时候出现Value can not be converted to requested type.
- JSP和ORACLE9之间的中文乱码问题?
楼主【dddeee】截止到2008-07-09 10:30:28的历史汇总数据(不包括此帖):
发帖的总数量:20 发帖的总分数:960 每贴平均分数:48
回帖的总数量:67 得分贴总数量:28 回帖的得分率:41%
结贴的总数量:18 结贴的总分数:940
无满意结贴数:0 无满意结贴分:0
未结的帖子数:2 未结的总分数:20
结贴的百分比:90.00 % 结分的百分比:97.92 %
无满意结贴率:0.00 % 无满意结分率:0.00 %
值得尊敬
两个线程可以同时访问geter,和seter
这样就可能一个线程set值的时候,另一个在get,你无法知道,这个时候你取得的值是set前的,还是set后的2>加了synchronized
两个线程同时只能访问geter或者seter,可以确保得到正确的值PS:实际加synchronized这个关键字,我们是在保护private String name这个变量
是在确保同时只有一个线程在访问它,所以所有对它进行了操作的方法都应该加上
synchronized