一直对synchronized和锁的理解不太好,在网上看了很多资料,还是没有解决疑惑. 请教大家:
- 简单的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应该都一样啊.
- 在上一个例子中,在该类内部访问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位的类型的操作是原子的"
说明对象引用的赋值的确是原子的