您的位置:首页 > 编程语言 > Java开发

java学习笔记之容器的同步与只读控制

2015-09-23 17:30 501 查看

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: