Java CopyOnWriteArray
2016-03-30 10:22
381 查看
package concurrent; import java.util.Arrays; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.locks.ReentrantLock; /* * @author: wjf * @version: 2016年3月30日 上午9:51:17 */ public class TestCopyOnWrite { public static void main(String[] args){ /*具体 add 的代码,修改时复制,添加 修改元素时,先新建一个 array,修改完之后,将原来的array 指向新的array, *这样在添加元素的时候,旧的array一眼可以向外部提供 并发读的 服务,这是一种读写分离的思想,但是就是读的可能不是最新的数据 *在实时性系统中并不适用,适用于读多写少的场景,比如黑名单机制,大多数情况下是读取黑名单,修改一般较少, * 可以使用类似思想实现任何的 copyOnWrite 容器 * * public boolean add(E e) { final ReentrantLock lock = this.lock; lock.lock(); try { Object[] elements = getArray(); int len = elements.length; Object[] newElements = Arrays.copyOf(elements, len + 1); newElements[len] = e; setArray(newElements); return true; } finally { lock.unlock(); } } */ CopyOnWriteArrayList<Integer> list=new CopyOnWriteArrayList<Integer>(); } }
自己实现 copyOnWriteMap
class CopyOnWriteMap<K,V> implements Map<K,V> ,Cloneable{ private volatile Map<K,V> internalMap; public CopyOnWriteMap(){ this.internalMap=new HashMap<K,V>(); } @Override public V get(Object key) { // TODO Auto-generated method stub return internalMap.get(key); } @Override public V put(K key, V value) { // TODO Auto-generated method stub synchronized(this){ HashMap<K,V> newMap=new HashMap<K,V>(internalMap); newMap.put(key, value); this.internalMap=newMap; } return value; } @Override public V remove(Object key) { // TODO Auto-generated method stub synchronized(this){ HashMap<K,V> newMap=new HashMap<K,V>(internalMap); V value=newMap.remove(key); this.internalMap=newMap; return value; } } @Override public void putAll(Map<? extends K, ? extends V> m) { // TODO Auto-generated method stub synchronized(this){ HashMap<K,V> newMap=new HashMap<K,V>(internalMap); newMap.putAll(m); this.internalMap=newMap; } } }
相关文章推荐
- java反射例子详解
- [Java] Java中List 去掉重复的值,并保持原先List顺序
- java项目debug 的时候总是跳转threadpoolexecutor
- Java中的注解是如何工作的?
- java实现格雷码生成
- Spring注解@Component、@Repository、@Service、@Controller区别
- Spring 注释 @Autowired 和@Resource 的区别
- Unable to associate project with a runtime server in eclipse IDE
- SpringMVC小结
- MyEclipse Professional 2014与MyEclipse 2015共存
- Eclipse4/RCP 模型化的UI
- Spring源代码解析(收藏)
- Spring+Jersey+JPA+Hibernate+MySQL实现CRUD操作案例
- Eclipse4/RCP 架构概况
- commons-dbutils使用介绍
- Java:单例模式的七种写法
- JavaWeb常见问题总结及解决(待更新)
- Eclipse配置svn 并从svn上面下载项目(将eclipse上面项目添加到svn上)
- Java反射机制(获取Class对象的三种方式+获取Class中的构造函数进行对象的初始化+获取反射类的字段+获取反射类的一般方法)
- java工厂模式详解