一、同步控制:多線程并發通路集合的線程安全
1.常用容器ArrayList HashSet HashMap等都是線程不安全的
2.Collections提供了synchronized()方法,将指定容器包裝同步
synchronizedList()
synchronizedSet()
synchronizedMap()
import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * 使用collections管理同步容器 */ public class Test01 { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); // list可以同步 List<String> synList = Collections.synchronizedList(list); System.out.println("線程安全的list制作完畢"); } }
二、不可變設定:“隻讀”通路,
1.Collections提供了三種方法
(1) emptyXxx()空的不可變集合
(2)singletonXxx()一個元素不可變的集合
(3)unmodifiableXxx()不可變容器
import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; /** * 隻讀設定 * 1.emptyXxx()空的不可變集合 * emptyList() * emptyMap() * emptySet() * 2.singletonXxx()一個元素不可變的集合 * singleton(T o) * singletonList(T o) * singletonMap(K key, V value) * 3.unmodifiableXxx()不可變容器 * unmodifiableList(List<? extends T> list) * unmodifiableSet(Set<? extends T> s) * unmodifiableMap(Map<? extends K,? extends V> m) * */ public class Test02 { public static void main(String[] args) { Map<String, String> map=new HashMap<>(); map.put("test", "testXXXXX"); map.put("嘻嘻", "嘻嘻嘻嘻"); //隻讀控制 Map<String, String>map2=Collections.unmodifiableMap(map); //map2.put("a", "a");//不能操作,會報異常 java.lang.UnsupportedOperationException System.out.println(map2.size()); //一個元素的容器測試 List<String> list= Collections.singletonList(new String()); list.add("test"); //list.add("哈哈哈哈");//隻能包含一個元素的容器,會報錯 } public static Set<String> oper(Set<String>set){ if(null==set){ return Collections.EMPTY_SET;//外部擷取避免NullPointerException } return set; } }
2.ImmutableList
使用ImmutableList,需要使用guava集合庫;
Guava:google的工程師利用傳說中的“20%時間”開發的集合庫,它是對jdk提供的擴充,提供了很多實用的類來簡化代碼。
開源位址:https://github.com/google/guava
jar包下載下傳:http://maven.outofmemory.cn/com.google.guava/guava/
guava對隻讀設定安全可靠,并且相對簡單。
import java.util.ArrayList; import java.util.Collections; import java.util.List; import com.google.common.collect.ImmutableList; /** * 隻讀設定 */ public class Test01 { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); //對原有的list進行包裝,相等于原有list的一個視圖,快照,不夠安全 List<String> readList=Collections.unmodifiableList(list); //readList.add("d");//java.lang.UnsupportedOperationException list.add("d");//改變原有list 視圖也一起改變 //對比檢視 初始化list guava對隻讀設定安全可靠,并且相對簡單 List<String> immutableList=ImmutableList.of("a", "b", "c"); immutableList.add("d");//java.lang.UnsupportedOperationException } }