1. 程式人生 > >java學習筆記之容器的同步與只讀控制

java學習筆記之容器的同步與只讀控制

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