- 浏览: 2573713 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (880)
- 每日总结 (26)
- java (37)
- lucene 2.4源码学习 (11)
- 庖丁分词的源码分析 (5)
- cindy源码阅读 (10)
- jetty (3)
- java基础 (49)
- hadoop (37)
- python (7)
- 那些蛋疼的事 (15)
- 测试 (5)
- spring (3)
- redis (4)
- git (4)
- 我的开源项目 (2)
- linux (15)
- mysql (8)
- bootsharp (1)
- idea (1)
- Disruptor源码分析 (11)
- 高并发 (22)
- jdk (4)
- 领域驱动 (1)
- 坑 (6)
- 表达式框架 (7)
- 游戏 (3)
- Guava (1)
- 缓存 (1)
- 数据库 (1)
- 游戏项目 (3)
- java8 (1)
最新评论
-
hsluoyz:
PyCasbin是一个用Python语言打造的轻量级开源访问控 ...
权限管理的一个简单后台 -
liuyachao111:
谢谢 问题解决了
对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾 -
jnjeC:
多谢博主分享,在配置文件里的&也要改成& ...
对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾 -
大维啊:
同志,你这不行啊!
java 的 AccessController.doPrivileged使用 -
lisha2009:
解决了我的问题,多谢博主分享!
对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾
java的BitSet不是线程安全的,所以多线程的时候h要加锁。
1 直接加锁整个BitSet 用时:3.4秒
2 BitSet拆成更小的粒度 用时:3.6秒
3 使用并发的BitSet,自己写了个AtomicBitSet 用时:3.3秒
从测试结果来看 性能都差不多
感觉有点疑惑,在我的想象中2还和3应该会比1好不少的啊
下面3个测试分别对应3种方式
附件是完整代码
测试1
测试2
测试3
并发安全BitSet:
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; } } } } class Task1 implements Runnable { private int id; private BitSet bitset; public Task1(BitSet bitset, int id) { this.bitset = bitset; this.id = id; } @Override public void run() { synchronized (bitset) { bitset.set(id); } } } class ReadBitTask1 implements Runnable { private int id; private BitSet bitset; public ReadBitTask1(BitSet bitset, int id) { this.bitset = bitset; this.id = id; } @Override public void run() { synchronized (bitset) { bitset.get(id); } } }
测试2
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.6秒 * @author bean */ public class BitsetTest2 { public static final int NUM = 50000000; static Object[] locks; static { locks = new Object[10000]; for (int i = 0; i < 10000; i++) { locks[i] = new Object(); } } @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 Task2(bitset, i)); } else { executorService.execute(new ReadTask2(bitset, i)); } } executorService.shutdown(); while (true) { if (executorService.isTerminated()) { break; } } } public static Object getLock(int i) { return locks[i % 10000]; } } class Task2 implements Runnable { private int id; private BitSet bitset; public Task2(BitSet bitset, int id) { this.bitset = bitset; this.id = id; } @Override public void run() { Object lockObject = BitsetTest2.getLock(id); synchronized (lockObject) { bitset.set(id); } } } class ReadTask2 implements Runnable { private int id; private BitSet bitset; public ReadTask2(BitSet bitset, int id) { this.bitset = bitset; this.id = id; } @Override public void run() { Object lockObject = BitsetTest2.getLock(id); synchronized (lockObject) { bitset.get(id); } } }
测试3
package com.eyu.gift.service; import java.util.Random; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; import org.junit.Test; /** * 用时3.3秒 * @author bean */ public class BitSetTest3 { public static final int NUM = 50000000; @Test public void mutiAtomThreadTest() { AtomicBitSet bitset = new AtomicBitSet(NUM); 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 Task3(bitset, i)); } else { executorService.execute(new ReadTask3(bitset, i)); } } executorService.shutdown(); while (true) { if (executorService.isTerminated()) { break; } } } } class Task3 implements Runnable { private int id; private AtomicBitSet bitset; public Task3(AtomicBitSet bitset, int id) { this.bitset = bitset; this.id = id; } @Override public void run() { bitset.set(id); } } class ReadTask3 implements Runnable { private int id; private AtomicBitSet bitset; public ReadTask3(AtomicBitSet bitset, int id) { this.bitset = bitset; this.id = id; } @Override public void run() { bitset.get(id); } }
并发安全BitSet:
package com.eyu.gift.service; import java.util.concurrent.atomic.AtomicIntegerArray; public class AtomicBitSet { private final AtomicIntegerArray array; public AtomicBitSet(int length) { int intLength = (length + 31) / 32; array = new AtomicIntegerArray(intLength); } public void set(long n) { int bit = 1 << n; int idx = (int) (n >>> 5); while (true) { int num = array.get(idx); int num2 = num | bit; if (num == num2 || array.compareAndSet(idx, num, num2)) return; } } public boolean get(long n) { int bit = 1 << n; int idx = (int) (n >>> 5); int num = array.get(idx); return (num & bit) != 0; } }
- service.zip (3.7 KB)
- 下载次数: 2
发表评论
-
Quartz 1.8.0版本的死锁问题
2017-01-05 15:04 5670先说问题的结论:https:/ ... -
Calendar.getInstance()的坑
2016-12-06 16:50 5832Calendar.getInstance()看起来应该是个单例 ... -
java线程池自己掉进去的坑
2016-08-18 17:59 2084java线程池的maximumPoolSize的生效条件真的是 ... -
java比AtomicLong 更高效的LongAdder
2016-04-14 21:05 3187AtomicLong 是通过cas来实现的,已经很高效了,还有 ... -
java避免缓存伪共享
2016-04-14 20:15 907java8之前的做法: 加6个无用的long字段 如: ... -
java重复批次执行
2015-04-21 20:39 1466方案1 使用Phaser 方案2 使用CyclicBarr ... -
两个线程,分别打印[1,3,5]和[2,4,6],写一个程序,打印[1,2,3,4,5,6]。
2015-04-21 17:13 3905两个线程,分别打印[1,3,5]和[2,4,6],写一个程序, ... -
mina实现相同session后到的请求一定后处理的原理
2015-03-26 22:04 3709mina后面的业务处理是一个线程池去处理的,在线程池的多线程的 ... -
简单实现一个java公平策略的锁
2015-03-24 21:40 1372代码是: package com.eyu.gift.loc ... -
java的Condition 加强版的wait notify
2015-01-29 20:26 5209Lock对应Synchronized,使用之前都要先获取锁 ... -
java用cyclicBarrier来实现Phaser的分段功能
2015-01-26 10:22 1558cyclicBarrier是有自动重置功能的,我们可以用这个功 ... -
java的Phaser,多线程分阶段执行
2015-01-25 12:00 1917Phaser是处理分阶段的多线程的很好的方法: 比如需求是: ... -
spring启动的时候尝试多线程发生的死锁
2014-09-12 11:12 3888具体的死锁线程dump: Found one Java-l ... -
System.nanoTime()的使用
2013-09-19 17:47 44517纳秒 ns(nanosecond):纳秒, 时间单位。一秒 ... -
java原子更新器AtomicReferenceFieldUpdater的使用
2013-09-19 11:32 15249AtomicReferenceFieldUpdater ... -
linux下文件的append是原子的(线程安全的)
2013-09-17 15:07 2820具体的理由可以参考这个文章:http://www.pagefa ... -
java Unsafe类的compareAndSwap方法
2013-09-15 12:43 18516compareAndSwap是个原子方法,原理是cas.就是说 ... -
java 反射的field.setAccessible(true)
2013-09-15 11:43 15302在java的反射使用中,如果字段是私有的,那么必须要对这个字段 ... -
ReentrantLock原理的源码解读
2013-09-15 01:16 12279可以参照http://blog.csdn.net/chen77 ... -
转 Java的Volatile
2013-09-07 17:24 1309原文:http://ifeve.com/syn-jmm-vol ...
相关推荐
java bitset 高级数据结构 源码解析 适合 0-3 年开发人员,进阶、面试必备知识!
bitset源码Java 这是 Java Bitset 类的字对齐压缩变体。 我们提供 64 位和 32 位类似 RLE 的压缩方案。 它可用于实现位图索引。 它所依赖的 EWAH 格式用于运行 GitHub 的 git 实现。 字对齐压缩的目标不是实现最佳...
bitset源码Java源码分析 基础集合列表 ArrayList (done) Vector (done) LinkedList (done) Stack (done) ReferenceQueue (done) ArrayDeque (done) Set HashSet (done) TreeSet (done) LinkedHashSet (done) BitSet ...
主要介绍了浅谈Java BitSet使用场景和代码示例,具有一定借鉴价值,需要的朋友可以参考下。
java bitset 源码 最后更新于20180424 (Toc generated by ) 数据结构 队列 非阻塞队列:ConcurrentLinkedQueue(无界线程安全),采用CAS机制(compareAndSwapObject原子操作)。 阻塞队列:ArrayBlockingQueue(有界...
Java8的函数式编程能够大大减少代码量和便于维护,同时,还有一些跟并发相关的功能。开发中常用到的新特性如下: 1. 接口的默认方法和静态方法 在Java8之前,接口中只能包含抽象方法。那么这有什么样弊端呢?比如,...
bitset用法bitset用法bitset用法bitset用法bitset用法bitset用法
基于JDK1.8的BitSet 源码分析, 描述了实现的原理 个方法的含义 虽然没有写出实际的测试代码 但是只要是细度了我的这个分析 在使用的时候就不是问题了
Java 原生包 BitSet 源码,0~3年 Java 工程师必看,属于高级数据结构,利于进阶,面试必备!
java bitset源码 目前进度(171/237) LeetCode做题笔记 Add two numbers:给定一个数集合和一个数,已知集合中有两个数的和是给定数,求这两个加数的index 方法1:暴力,n^2时间复杂度,不推荐 方法2:快速排序nlogn...
多线程 线程安全 一致性、事务 事务 ACID 特性 事务的隔离级别 MVCC 锁 Java中的锁和同步类 公平锁 & 非公平锁 悲观锁 乐观锁 & CAS ABA 问题 CopyOnWrite容器 RingBuffer 可重入锁 & 不可重入锁 互斥锁 & 共享锁 ...
C语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC语言头文件 BITSETC...
在C++的STL中实现由一个bitset类模板,其用法如下: std::bitset<64> bs; 也就是说,这个bs只能支持64位以内的位存储和操作;bs一旦定义就不能动态增长了。本资源附件中实现了一个动态Bitset,和标准bitset兼容。 /*...
java基础之BitSet - 副本
bitset源码 这个仓库主要放一些 Demo 示例 目录 1. Kotlin 实现 IGetInt java 接口的方法示例: public class IGetInt { String get(int i); String get(Integer i); } 2. Java 并发示例 此部分Demo基本用于实现 《》...
java bitset 源码
bitset 源码 all-kinds-book 主要包含 java 大数据 数据仓库 数据分析 第三方组件 面试题 数据结构与算法 设计模式 软件设计 等文档 ,可以访问我们的官网查看更多内容 [人在地上跑 牛在天上飞](#人在地上跑 牛在...
RoaringBitmap, 在Java中,一个更好的压缩 bitset RoaringBitmap Bitsets,也称为位图,通常用作快速数据结构。 不幸的是,他们可以使用太多的内存。 为了补偿,我们经常使用压缩位图。咆哮位图是压缩位图,它比传统...
java bitset 源码 redis-bloomFilter redis-bloomFilter是基于redis的bitset实现的bloomfilter.具体原理和实现思路可以参考 使用 redis-bloomFilter发布在JitPack,可以选择下载源码编译,或者通过jitpack源添加依赖...