java學習筆記之容器的同步與只讀控制
阿新 • • 發佈:2019-02-09
1、容器的同步
多執行緒併發訪問集合的執行緒安全。
常用容器ArrayList、HashMap、HashSet等都是執行緒不安全的。
java.util.Collections提供了synchronizedXxx()方法將指定容器包裝成同步。
synchronizedList(List list);
synchronizedSet(Set set);
synchronizedMap(Map map);
例子:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 容器的同步
* @author ly1
*
*/
public class TestSyn {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
List<String> list2 = new ArrayList<String>();
// 這裡list2是執行緒安全的
list2 = Collections.synchronizedList(list);
}
}
2、只讀訪問
容器內的元素只讀,不可修改。
java.util.Collections提供了三種方法:
empty(Xxx xx); 空的不可變的集合
singleton(Object o); 含指定物件的一個元素的不可變的集合
unmodifiableXxx(Xxx xx); 不可變容器
例子:
import java.util.Collections;
import java.util .HashSet;
import java.util.Set;
/**
* 容器的只讀控制
*
* @author ly1
*
*/
public class TestReadOnly {
public static void main(String[] args) {
//1、只讀空容器
Set set = fun(null);
System.out.println(set.size());
//set.add("ele"); //引發java.lang.UnsupportedOperationException
//2、只含一個物件的只讀容器
Set singleton = Collections.singleton(new String("Hello"));
System.out.println(singleton.size());
//singleton.add("ele"); //引發java.lang.UnsupportedOperationException
//3、只讀容器
Set ReadOnlySet = new HashSet();
ReadOnlySet.add("hi");
ReadOnlySet.add("hello");
ReadOnlySet.add("welcome");
ReadOnlySet = Collections.unmodifiableSet(ReadOnlySet);
System.out.println(singleton.size());
//ReadOnlySet.add("ele"); 引發java.lang.UnsupportedOperationException
}
public static Set fun(Set set){
//這裡操作set
//返回set,避免返回null,引發NullPointerException
return set == null ? Collections.emptySet() : set;
}
}