并发库学习笔记三
来源:互联网 发布:磊科 网络尖兵配置 编辑:程序博客网 时间:2024/06/05 16:02
Synchronized 是lock的一种简化实现,一个lock可以应对多个condition
而synchronized把lock和condiiton合并了,一个synchronized Lock
只对应一个condition 在jdk中他们的效率差不多
注:不要在lock和condition上使用wait notify notifyAll方法
使用AtomicInteger
class Counter {
private volatile int count = 0;
// 若要线程安全执行count++,需要加锁
public synchronized void increment() {
count++;
}
public int getCount() {
return count;
}
}
class Counter2 {
private AtomicInteger count = new AtomicInteger();
//使用AtomicInteger后,不需要加锁,也可以实现线安全
public void increment() {
count.incrementAndGet();
}
public int getCount() {
return count.get();
}
}
这是硬件提供原子操作指令实现的,其他的原子操作还有
AtomicBoolean AtomicLong AtomicReference<T>
使用Lock-Free算法
class Counter {
private volatile int max = 0;
// 若要线程安全执行count++,需要加锁
public synchronized void set(int value) {
if (value > max) {
max = value;
}
}
public int getMax() {
return max;
}
}
class Counter2 {
private AtomicInteger max = new AtomicInteger();
// 使用AtomicInteger后,不需要加锁,也可以实现线安全
public void set(int value) {
for (;;) {
int current = max.get();
if (value > current) {
if (max.compareAndSet(current, value)) {
break;
} else {
continue;
}
} else {
break;
}
}
}
public int getCount() {
return max.get();
}
}
Lock-Free的数据结构
class BeanManager {
private Map<String, Object> map = new HashMap<String, Object>();
public Object getBeans(String key) {
synchronized (map) {
Object bean = map.get(key);
if (bean == null) {
map.put(key, createBean());
bean = map.get(key);
}
return bean;
}
}
}
class BeanManager2 {
private ConcurrentMap<String, Object> map = new ConcurrentHashMap<String, Object>();
public Object getBeans(String key) {
Object bean = map.get(key);
if (bean == null) {
map.putIfAbsent(key, createBean());
bean = map.get(key);
}
return bean;
}
}
- 并发库学习笔记三
- Java并发学习笔记(三)-闭锁CountDownLatch
- 学习笔记(九)并发(三)
- 并发库学习笔记一
- 并发库学习笔记二
- 并发库学习笔记四
- 并发库学习笔记五
- Go语言并发与并行学习笔记(三)
- Go语言并发与并行学习笔记(三)
- JAVA高并发学习笔记(三) JMM(Java内存模型)
- Java并发编程实战学习笔记(三)-线程封闭
- 并发学习笔记(三):join与wait/notify
- JAVA学习笔记(三)-并发编程 Callable Future CompleableFuture
- Go语言并发与并行学习笔记(三)
- JAVA并发编程笔记三
- JavaSE学习笔记--线程并发库
- java学习笔记之线程并发库
- Java并发学习笔记
- 八皇后问题Java版
- C#程序设计(二)----数组排序
- Hibernate框架(二)
- 全局变量、extern/static/const区别与联系
- 提高VS2010/Vs2008反应速度方法
- 并发库学习笔记三
- 关于软件盗版问题的一些思考
- 初学Android,传递复杂数据的Service(六十一)
- Linux vi
- POJ 3278 Catch That Cow
- 推荐资源网站(更新中)
- static_cast、dynamic_cast、reinterpret_cast和const_cast的区别与比较
- contentProvider中实现GroupBy查询
- 我们爱面试,一面一学-----谷歌八道面试题--【1】求一个满足要求的数组