java的BitSet不是线程安全的,所以多线程的时候h要加锁。
1 直接加锁整个BitSet 用时:3.4秒
2 BitSet拆成更小的粒度 用时:3.6秒
3 使用并发的BitSet,自己写了个AtomicBitSet 用时:3.3秒
从测试结果来看 性能都差不多
感觉有点疑惑,在我的想象中2还和3应该会比1好不少的啊
下面3个测试分别对应3种方式
附件是完整代码
测试1
package com.eyu.gift.service;
import java.util.BitSet;
import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import org.junit.Test;
/**
* 用时3.4秒
* @author bean
*/
public class BitsetTest1 {
public static final int NUM = 50000000;
@Test
public void mutiThreadTest() {
BitSet bitset = new BitSet();
ThreadPoolExecutor executorService = (ThreadPoolExecutor) Executors.newFixedThreadPool(20);
int total = NUM / 10;
Random random = new Random(1234);
for (int i = 1; i < total; i++) {
int targrt = random.nextInt(NUM);
if (targrt % 5 == 0) {
executorService.execute(new Task1(bitset, i));
} else {
executorService.execute(new ReadBitTask1(bitset, i));
}
}
executorService.shutdown();
while (true) {
if (executorService.isTerminated()) {
break;
}
}