2.1同步
synchnized 同步锁,使得调用方法变成同步访问对象属性。
方法带有 synchronized 则一个对象带有一把锁,多个对象在 JVM 中是异步的,所以多个对象的多把锁表现为异步的。
setValue() 时,中途进行 getValue() ,如果 getValue() 没有同步则可能出现脏读。
同步锁作用于对象,非同步方法可以异步调用,同一对象的多个同步方法是同步调用。
public class MyObject {
private String userName = "A";
private String password = "AA";
synchronized public void setValue(String userName, String password){
this.userName = userName;
try {
Thread.sleep(3000);//delay cause the dirtyRead
}catch (Exception e){
}
this.password = password;
}
public void getValue(){
System.out.println(this.userName + "," + this.password);
}
}
getValue() 加上同步之后不会有脏读
public class MyObject {
private String userName = "A";
private String password = "AA";
synchronized public void setValue(String userName, String password){
this.userName = userName;
try {
Thread.sleep(3000);//delay cause the dirtyRead
}catch (Exception e){
}
this.password = password;
}
//Add synchronized
synchronized public void getValue(){
System.out.println(this.userName + "," + this.password);
}
}
一个线程获得某个对象的锁,对象锁未释放时还想再次获得锁,是可以的。
如果锁不可重入,会造成死锁。
子类可以通过“可重入锁”调用父类的同步方法。
当前线程出现异常时,锁自动释放。
同步不具有继承性。
若 A 线程执行任务花的时间较长,那么 B 线程会等待较长时间。
-
可以使用同步块的方法来解决,同步块也是锁定对象。
synchronized(this){ this.data = data; }
只同步共用的部分。
- 每个对象都具有锁性质。
- synchronized 默认锁住的是对象
- synchronized(object) 是使用对象监视器来实现同步,使用的锁是 object 的锁。
- 锁是一个线程与一个同步监视器(锁对象)之间的关系,对象自己作为锁时『synchronized(this)』,自己线程对锁(自身)的访问也涉及锁。不同线程间不加 synchronized 则认为是异步调用。