List是线程安全的吗?若不是安全,怎么变成安全的 50
2个回答
展开全部
你说的是java还是C++?
java中解决这个问题通常有两种方法
一:使用synchronized关键字;
二:使用Collections.synchronizedList();
假如你创建的代码如下:List<Map<String,Object>> data=new ArrayList<Map<String,Object>>();
那么为了解决这个线程安全问题你可以这么使用Collections.synchronizedList()
如:
List<Map<String,Object>> data=Collections.synchronizedList(new ArrayList<Map<String,Object>>());
把new关键字换一下就可以了其他的都没变,使用方法可以参考api文档;
C++中的List有两种:
一种是你自己手动实现的list数据结构,一种就是STL给你封装好的。
如果你是自己手动实现的,那么就发源码来,我帮你看怎么优化。
如果是用stl的
那么你不能期望STL给你线程支持,因为它要的是效率。
需要注意的是:
1. 多个线程的读是安全的。多线程可同时读取一个容器内容。只能是读,不能写。
2. 对不同容器的多个写入是安全的。多线程可以同时写不同容器。 注意,是不同容器。
所以你应该自己写一个针对容器的模板类来实现加锁(构造的时候加锁,析构的时候释放),然后在访问容器的时候,定义一个该类的临时变量,临时变量可以保证如果抛出了异常,该临时对象也会被销毁,从而也释放掉锁。
java中解决这个问题通常有两种方法
一:使用synchronized关键字;
二:使用Collections.synchronizedList();
假如你创建的代码如下:List<Map<String,Object>> data=new ArrayList<Map<String,Object>>();
那么为了解决这个线程安全问题你可以这么使用Collections.synchronizedList()
如:
List<Map<String,Object>> data=Collections.synchronizedList(new ArrayList<Map<String,Object>>());
把new关键字换一下就可以了其他的都没变,使用方法可以参考api文档;
C++中的List有两种:
一种是你自己手动实现的list数据结构,一种就是STL给你封装好的。
如果你是自己手动实现的,那么就发源码来,我帮你看怎么优化。
如果是用stl的
那么你不能期望STL给你线程支持,因为它要的是效率。
需要注意的是:
1. 多个线程的读是安全的。多线程可同时读取一个容器内容。只能是读,不能写。
2. 对不同容器的多个写入是安全的。多线程可以同时写不同容器。 注意,是不同容器。
所以你应该自己写一个针对容器的模板类来实现加锁(构造的时候加锁,析构的时候释放),然后在访问容器的时候,定义一个该类的临时变量,临时变量可以保证如果抛出了异常,该临时对象也会被销毁,从而也释放掉锁。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询