在http://blog.csdn.net/xyc_csdn/article/details/78155932这篇博客中详细讲了一下synchronized关键字的使用方法。在这里补充几个使用synchronized时需要注意的点。
先看代码
- ObjectLock.java
package com.xiayc.sync;
public class ObjectLock {
private String name;
public ObjectLock(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- ConstantSynchronized.java
package com.xiayc.sync;
public class ConstantSynchronized {
private Long id;
private String name;
private String stringLock = "LOCK";
private Integer integerLock = 1;
private double doubleLock = 1D;
private ObjectLock objectLock = new ObjectLock("objectLock");
public ConstantSynchronized(Long id, String name) {
super();
this.id = id;
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
synchronized (this.objectLock) {
return name;
}
}
public void setName(String name) {
synchronized (this.objectLock) {
try {
// this.stringLock="hhh";
// this.integerLock=2;
this.objectLock.setName("hhh");
Thread.sleep(3000);
this.name = name;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
ConstantSynchronized constantSynchronized = new ConstantSynchronized(1L,"任务1");
new Thread(new Runnable() {
@Override
public void run() {
constantSynchronized.setId(2L);
constantSynchronized.setName("任务2");
}
}, "t1").start();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("id:"+constantSynchronized.getId());
System.out.println("name:"+constantSynchronized.getName());
}
}, "t2").start();
}
}
总结
synchronized关键字不能修饰int、double等基本数据类型;
synchronized关键字最好不要修饰String、Integer等基本数据对象类型,因为如果基本数据对象类型的值发生改变的话,原先加的锁可能会丢失;
synchronized关键字修饰对象时,如果对象的属性值发生改变(对象本身发生改变例外)不会影响锁的稳定;