`

集合之线程安全

阅读更多
Map map = Collections.synchronizedMap(new HashMap(1));
          Collections.synchronizedList(new ArrayList());
 private static class SynchronizedMap<K,V> 
 implements Map<K,V>, Serializable { 
 // use serialVersionUID from JDK 1.2.2 for interoperability 
 private static final long serialVersionUID = 1978198479659022715L; 
  
 private final Map<K,V> m;     // Backing Map 
        final Object      mutex; // Object on which to synchronize 
  
 SynchronizedMap(Map<K,V> m) { 
            if (m==null) 
                throw new NullPointerException(); 
            this.m = m; 
            mutex = this; 
        } 
  
 SynchronizedMap(Map<K,V> m, Object mutex) { 
            this.m = m; 
            this.mutex = mutex; 
        } 
  
 public int size() { 
     synchronized(mutex) {return m.size();} 
        } 
 public boolean isEmpty(){ 
     synchronized(mutex) {return m.isEmpty();} 
        } 
 public boolean containsKey(Object key) { 
     synchronized(mutex) {return m.containsKey(key);} 
        } 
 public boolean containsValue(Object value){ 
     synchronized(mutex) {return m.containsValue(value);} 
        } 
 public V get(Object key) { 
     synchronized(mutex) {return m.get(key);} 
        } 
  
 public V put(K key, V value) { 
     synchronized(mutex) {return m.put(key, value);} 
        } 
 public V remove(Object key) { 
     synchronized(mutex) {return m.remove(key);} 
        } 
 public void putAll(Map<? extends K, ? extends V> map) { 
     synchronized(mutex) {m.putAll(map);} 
        } 
 public void clear() { 
     synchronized(mutex) {m.clear();} 
 } 
  
 private transient Set<K> keySet = null; 
 private transient Set<Map.Entry<K,V>> entrySet = null; 
 private transient Collection<V> values = null; 
  
 public Set<K> keySet() { 
            synchronized(mutex) { 
                if (keySet==null) 
                    keySet = new SynchronizedSet<K>(m.keySet(), mutex); 
                return keySet; 
            } 
 } 
  
 public Set<Map.Entry<K,V>> entrySet() { 
            synchronized(mutex) { 
                if (entrySet==null) 
                    entrySet = new SynchronizedSet<Map.Entry<K,V>>(m.entrySet(), mutex); 
                return entrySet; 
            } 
 } 
  
 public Collection<V> values() { 
            synchronized(mutex) { 
                if (values==null) 
                    values = new SynchronizedCollection<V>(m.values(), mutex); 
                return values; 
            } 
        } 
  
 public boolean equals(Object o) { 
            synchronized(mutex) {return m.equals(o);} 
        } 
 public int hashCode() { 
            synchronized(mutex) {return m.hashCode();} 
        } 
 public String toString() { 
     synchronized(mutex) {return m.toString();} 
        } 
        private void writeObject(ObjectOutputStream s) throws IOException { 
     synchronized(mutex) {s.defaultWriteObject();} 
        } 
    } 
  
  
 使用了Collections.synchronizedMap(new HashMap(1))就将非线程安全的变为线程安全的了,同时性能也降低了,但有些时候也并非那么完美,比如并发的时候:

 Map map = Collections.synchronizedMap(new HashMap(1)); 
 if(map.containsKey("str")){ 
  map.remove("str"); 
 } 
  
 jdk1.5新增了ConcurrentLinkedQueue、ConcurrentHashMap、CopyOnWriteArrayList 和CopyOnWriteArraySet对这些集合进行并发修改是安全的。

分享到:
评论

相关推荐

    Java集合多线程安全.docx

    然而,并非所有集合类都是线程安全的,这在多线程环境中可能导致数据不一致或者运行时异常。线程安全指的是一个对象在多线程环境下可以被正确地访问和修改,而不会出现竞态条件或死锁等问题。 线程不安全的集合类...

    Java多线程安全集合

    在Java编程中,多线程安全集合是程序员在并发环境下处理数据共享时必须考虑的关键概念。这些集合确保了在多个线程访问时的数据一致性、完整性和安全性,避免了竞态条件、死锁和其他并发问题。Java提供了一系列的线程...

    java集合类线程安全.doc

    Java 集合类线程安全 Java 集合框架是由 Java 平台标准版 1.2 引入的通用数据结构与算法框架。其灵活的面对对象设计受到了广大 Java 程序员的一致青睐,为 Java 平台的成熟奠定了坚实的基础。 线程安全不是一个...

    C#多线程List的非线程安全性

    2. 使用线程安全的集合:.NET框架提供了线程安全的集合类,如ConcurrentBag、ConcurrentQueue和ConcurrentStack等,它们在内部实现了线程同步,可以安全地在多线程环境下使用。 3. 避免在多线程环境中直接修改List...

    c#官方线程安全集合源码

    在.NET框架中,C#提供了一系列的线程安全集合类,这些类被设计为在多线程环境下可以安全地进行数据操作。这些类是通过`System.Collections.Concurrent`命名空间提供的,确保了在并发访问时的数据一致性。让我们深入...

    第10讲 如何保证集合是线程安全的 ConcurrentHashMap如何实现高效地线程安全1

    首先,Java提供了一种简单粗暴的方法,即使用synchronized关键字或者Collections.synchronizedMap()方法来使非线程安全的集合变得线程安全。但是,这种全局锁的机制在高并发环境下可能导致性能瓶颈,因为所有操作...

    关于如何解决HashMap线程安全问题的介绍

    但是需要注意,虽然这个方法可以保证基本的线程安全,但迭代仍然是非线程安全的,即不能在遍历过程中修改Map。 2. 使用ConcurrentHashMap:Java从1.5版本开始引入了ConcurrentHashMap,它是线程安全且高并发性能的...

    详解java各种集合的线程安全

    Java 集合的线程安全详解 Java 集合的线程安全是指在多线程环境中,集合操作的安全性。 Java 中有多种集合类,如 Vector、ArrayList、LinkedList、HashTable、HashMap、HashSet 等,这些集合类在多线程环境中的安全...

    jdk中线程安全的集合类.docx

    ### JDK中线程安全的集合类详解 #### 1. 引言 在Java开发过程中,随着并发编程的日益普及,对于数据结构的选择也提出了更高的要求。非线程安全的数据结构如`HashMap`在高并发场景下可能会出现数据不一致等问题,这...

    构建线程安全应用程序

    在构建线程安全应用程序时,除了使用同步机制和ThreadLocal变量,还可以使用并发集合和高级并发对象。比如,Java的ConcurrentHashMap是一个线程安全的哈希表实现,它通过分段锁机制来实现线程安全,并提供较高的并发...

    Java的线程安全与不安全集合.docx

    在Java编程中,线程安全性和不安全性是并发编程中非常关键的概念。...在面对线程安全问题时,我们可以借助如`synchronized`关键字、`Collections.synchronizedList`等工具来增强集合的线程安全性。

    ArrayList的线程安全测试

    3. 使用线程安全的集合类:C# 4.0引入了`System.Collections.Concurrent`命名空间,其中包含了许多线程安全的集合类型,如ConcurrentBag、ConcurrentQueue、ConcurrentStack等。它们设计为并发访问,无需额外的同步...

    java线程安全总结.doc

    2. 使用线程安全的集合类,如`ConcurrentHashMap`、`CopyOnWriteArrayList`等。 3. 避免长时间持有锁,减少阻塞时间。 4. 优先使用更高粒度的同步,减少锁的使用范围。 5. 对于不可变对象,尽可能地使用它们,减少...

    hiredis的c++封装, 线程安全

    本文将深入探讨如何使用C++进行hiredis的封装,以实现线程安全的Redis客户端操作。 首先,hiredis是Redis官方提供的一个纯C语言的简单协议解析库,它专注于处理Redis命令和响应,而忽略了更高级别的抽象。为了在C++...

    Go-golang-set-Go的线程安全的和非线程安全的高性能集

    `golang-set`库提供了一种实现,包括线程安全和非线程安全的高性能集,非常适合在Go的并发环境中使用。 首先,我们要理解什么是线程安全和非线程安全。线程安全指的是在多线程环境下,一个函数或方法在同一时刻可以...

    .NET Framework4 线程安全集合详解

    .NET Framework 4 提供了一组线程安全的集合类,这些类位于 `System.Collections.Concurrent` 命名空间中,旨在提高多线程环境下的性能和安全性。这些集合类允许开发者在无需额外同步代码的情况下安全地进行并发读写...

    c#线程安全的源代码示例

    6. **并发集合(Concurrent Collections)**:如`ConcurrentBag`, `ConcurrentQueue`, `ConcurrentStack`等,这些集合类设计为线程安全的,允许多个线程并发添加和删除元素。 7. **异步编程(Async/Await)**:虽然...

    Java多线程运算集合

    - 原子类提供了线程安全的整型、长整型等基本类型操作,避免了使用锁带来的性能开销。 #### 十七、Java线程:新特征-障碍器 - **障碍器**: - `CyclicBarrier` 和 `CountDownLatch` 是两种常用的屏障类,用于...

    线程安全Vector

    虽然 `Vector` 在某些情况下可以满足需求,但由于其性能问题和潜在的线程安全陷阱,现代Java编程实践中更倾向于使用其他集合类,如 `ArrayList` 或并发集合类。理解不同集合类的特点及其适用场景对于编写高效、可靠...

Global site tag (gtag.js) - Google Analytics