容器的同步控制与只读设置JAVA133

来源:互联网 发布:泛雅网络教学平台页面 编辑:程序博客网 时间:2024/06/06 00:12

来源:http://www.bjsxt.com/
1、S02E133_01容器的同步控制与只读设置
(1)同步控制:多线程并发访问集合的线程安全(多人咬苹果不咬到其他人的手)
——常用ArrayList、HashSet、HashMap等都是线程不安全的
——Collections提供了synchronizedXxx()方法,将指定容器包装成同步
——1——synchronizedList()
——2——synchronizedSet()
——3——synchronizedMap()

package com.test.collections;import java.util.ArrayList;import java.util.Collections;import java.util.List;public class TestSyn {    public static void main(String[] args) {        //list不可同步        List<String> list = new ArrayList<String>();        list.add("a");        list.add("b");        //synList可以同步        List<String> synList = Collections.synchronizedList(list);        System.out.println("线程安全的" + synList + "制作完毕");    }}

(2)不可变设置:“只读”访问,Collections提供了三种方法

a.——emptyXxx():空的不可变的集合——1——static <T> List<T>  emptyList()           返回空的列表(不可变的)。 ——2——static <K,V> Map<K,V>  emptyMap()           返回空的映射(不可变的)。 ——3——static <T> Set<T>  emptySet()           返回空的 set(不可变的)。 b.——singletonXxx():一个元素不可变的集合——1——static <T> Set<T>  singleton(T o)           返回一个只包含指定对象的不可变 set。 ——2——static <T> List<T>  singletonList(T o)           返回一个只包含指定对象的不可变列表。 ——3——static <K,V> Map<K,V>  singletonMap(K key, V value)           返回一个不可变的映射,它只将指定键映射到指定值。 c.——unmodifiableXxx():不可变容器——1——static <T> Collection<T>  unmodifiableCollection(Collection<? extends T> c)           返回指定 collection 的不可修改视图。 ——2——static <T> List<T>  unmodifiableList(List<? extends T> list)           返回指定列表的不可修改视图。 ——3——static <K,V> Map<K,V>  unmodifiableMap(Map<? extends K,? extends V> m)           返回指定映射的不可修改视图。 ——4——static <T> Set<T>  unmodifiableSet(Set<? extends T> s)           返回指定 set 的不可修改视图。 ——5——static <K,V> SortedMap<K,V>  unmodifiableSortedMap(SortedMap<K,? extends V> m)           返回指定有序映射的不可修改视图。 ——6——static <T> SortedSet<T>  unmodifiableSortedSet(SortedSet<T> s)           返回指定有序 set 的不可修改视图。 
package com.test.collections;import java.util.Collections;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Set;public class TestReadOnly {    public static void main(String[] args) {        testMap();        testList();        System.out.println(testSet(null));//打印:[]    }    public static void testMap(){        Map<String, String> map =new HashMap<String, String>();        map.put("a1", "a1");        map.put("a2", "a2");        //只读控制        Map<String, String> map2 = Collections.unmodifiableMap(map);        //map2.put("a3", "a3");//此句产生异常java.lang.UnsupportedOperationException        System.out.println(map2.size());    }    public static void testList(){        //一个元素的容器测试        List<String> list = Collections.singletonList(new String("b1"));        //list.add("b2");//只能包含一个元素的容器,此句产生异常UnsupportedOperationException        System.out.println(list);    }    public static Set<String> testSet(Set<String> set){        if(null == set){            return Collections.emptySet();//外部获取避免NullPointerException        }        set.isEmpty();//没有上面if的处理,会产生异常NullPointerException        return set;    }}
0 0
原创粉丝点击