Synchronized是lock的一种简化实现,一个lock可以应对多个condition
而synchronized把lock和condiiton合并了,一个synchronizedLock
只对应一个condition在jdk中他们的效率差不多
注:不要在lock和condition上使用waitnotifynotifyAll方法
使用AtomicInteger
classCounter{
privatevolatileintcount=0;
//若要线程安全执行count++,需要加锁
publicsynchronizedvoidincrement(){
count++;
}
publicintgetCount(){
returncount;
}
}
classCounter2{
privateAtomicIntegercount=newAtomicInteger();
//使用AtomicInteger后,不需要加锁,也可以实现线安全
publicvoidincrement(){
count.incrementAndGet();
}
publicintgetCount(){
returncount.get();
}
}
这是硬件提供原子操作指令实现的,其他的原子操作还有
AtomicBooleanAtomicLong AtomicReference<T>
使用Lock-Free算法
classCounter{
privatevolatileintmax=0;
//若要线程安全执行count++,需要加锁
publicsynchronizedvoidset(intvalue){
if(value>max){
max=value;
}
}
publicintgetMax(){
returnmax;
}
}
classCounter2{
privateAtomicIntegermax=newAtomicInteger();
//使用AtomicInteger后,不需要加锁,也可以实现线安全
publicvoidset(intvalue){
for(;;){
intcurrent=max.get();
if(value>current){
if(max.compareAndSet(current,value)){
break;
}else{
continue;
}
}else{
break;
}
}
}
publicintgetCount(){
returnmax.get();
}
}
Lock-Free的数据结构
classBeanManager{
privateMap<String,Object>map=newHashMap<String,Object>();
publicObjectgetBeans(Stringkey){
synchronized(map){
Objectbean=map.get(key);
if(bean==null){
map.put(key,createBean());
bean=map.get(key);
}
returnbean;
}
}
}
classBeanManager2{
privateConcurrentMap<String,Object>map=newConcurrentHashMap<String,Object>();
publicObjectgetBeans(Stringkey){
Objectbean=map.get(key);
if(bean==null){
map.putIfAbsent(key,createBean());
bean=map.get(key);
}
returnbean;
}
}