使用synchronized:
使用synchronized关键字时,如果一个线程想要获取其他线程已经具有的锁,那么该线程将被阻塞
,直到锁可用,当该线程被阻塞等待锁时,他无法进行其他任何操作。
比较并交换(CAS):
使用该方式不用让其他线程进行等待,该方式是用cmpxchg系列指令实现。
原子变量类
使用原子操作,原子变量类可以认为是volatile变量的泛化,此方法也是由比较并交换方式来实现的。
查看资料
http://www.blogjava.net/freeman1984/archive/2011/10/17/361402.html
http://www.blogjava.net/freeman1984/archive/2011/10/17/361403.html
使用synchronized关键字时,如果一个线程想要获取其他线程已经具有的锁,那么该线程将被阻塞
,直到锁可用,当该线程被阻塞等待锁时,他无法进行其他任何操作。
比较并交换(CAS):
使用该方式不用让其他线程进行等待,该方式是用cmpxchg系列指令实现。
原子变量类
使用原子操作,原子变量类可以认为是volatile变量的泛化,此方法也是由比较并交换方式来实现的。
/**
* 原始操作类
* @author user
*
*/
public class SimulatedCAS {
private int value;
public synchronized int getValue(){
return value;
}
/**
* 判断内存中的值与预期的值进行比较,如果内存中的不变,那么就将新值赋给当前内存
* @param expected 原始值
* @param newValue 新值
* @return
*/
public synchronized int compareAndSwap(int expected,int newValue){
if(value==expected)
value=newValue;
return value;
}
}
public class CasCounter {
private SimulatedCAS value;
public CasCounter(SimulatedCAS value){
this.value=value;
}
public int getValue(){
return value.getValue();
}
public int increment(){
int oldValue=value.getValue();
if(value.compareAndSwap(oldValue, oldValue+1)!=oldValue)
oldValue=value.getValue();
return oldValue;
}
}
查看资料
http://www.blogjava.net/freeman1984/archive/2011/10/17/361402.html
http://www.blogjava.net/freeman1984/archive/2011/10/17/361403.html