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;
}
}