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

本文介绍了Java中容器的同步处理方法,包括如何通过java.util.Collections提供的synchronizedXxx()方法实现多线程环境下集合的线程安全。此外,还探讨了容器的只读控制,即如何使用emptyXxx(), singleton()及unmodifiableXxx()方法创建不可变的集合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值