import java.util.List
import org.apache.commons.lang3.ArrayUtils
public class Test_4 {
/**
* 多线程处理list
*
* @param data 数据list
* @param threadNum 线程数
*/
public synchronized void handleList(List<String> data, int threadNum) {
int length = data.size()
int tl = length % threadNum == 0 ? length / threadNum : (length
/ threadNum + 1)
for (int i = 0 i < threadNum i++) {
如州int end = (i + 1) * tl
HandleThread thread = new HandleThread("线程[" + (i + 1) + "] ", data, i 配碧* tl, end > length ? length : end)
thread.start()
渣卖蔽 }
}
class HandleThread extends Thread {
private String threadName
private List<String> data
private int start
private int end
public HandleThread(String threadName, List<String> data, int start, int end) {
this.threadName = threadName
this.data = data
this.start = start
this.end = end
}
public void run() {
// TODO 这里处理数据
data.subList(start, end).add("^&*")
System.out.println(threadName)
}
}
public static void main(String[] args) {
Test_4 test = new Test_4()
// 准备数据
List<String> data = new ArrayList<String>()
for (int i = 0 i < 5000 i++) {
data.add("item" + i)
}
test.handleList(data, 5)
System.out.println(ArrayUtils.toString(data))
}
}
ArrayList集合是不行的激雹,如果多线程同时添加元素,有可能产生线程安全问题态碧,程序也有可能报错。例如:一个线程正准备往进去写数据,突然切到另一个线程它先写了进入,在切回来这个线程并不知道这个位置已经写入了数据,所以它还是会傻傻的写入数据,这样另一个线程的数据就被覆盖了。如果是一边添加 ,一边遍历的话程序会产生ConcurrentModificationException异常。
所以要用copyonwritearraylist是最明闭帆好的选择,但是注意的是,添加元素时它的性能不是很好 。
第一个,add那里,如果只是add,则不需要lock,如果你add前需要先判断,避免重复add,那需要lock;第二个,jianList,这个函伏晌数是干嘛的,作用不明确,因此不知道是否需要lock。
另返数外,lock的对漏厅首象不需要是list本身,可以另外定义一个static的object就行。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)