Java中的ConcurrentBitSet使用小结

 更新时间:2025年12月14日 09:59:20   作者:有梦想的攻城狮  
本文主要介绍了Java中的ConcurrentBitSet使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、核心澄清:Java标准库无内置ConcurrentBitSet

Java标准库(java.util包)中并未提供ConcurrentBitSet类。原生BitSet是线程不安全的,多线程环境下直接操作可能导致数据竞争和不一致。若需实现线程安全的位操作,需借助以下方案:

二、推荐方案:Eclipse Collections的ConcurrentBitSet

1. 第三方库介绍

Eclipse Collections(原GS Collections)是一个高性能的Java集合框架,提供了线程安全的ConcurrentBitSet实现,位于org.eclipse.collections.impl.bitset包中。其特点包括:

  • 线程安全:通过内部锁机制保证多线程访问的安全性。
  • 高效内存:基于long数组存储位数据,空间效率与原生BitSet一致。
  • 丰富API:支持所有原生BitSet的操作(如setclearflip等),并扩展了并发场景下的专用方法。

2. 使用示例

(1) 添加依赖

<dependency>
    <groupId>org.eclipse.collections</groupId>
    <artifactId>eclipse-collections</artifactId>
    <version>11.1.0</version>
</dependency>

(2) 基本操作

import org.eclipse.collections.impl.bitset.ConcurrentBitSet;

public class ConcurrentBitSetDemo {
    public static void main(String[] args) {
        // 创建并发BitSet实例
        ConcurrentBitSet bits = new ConcurrentBitSet(100);

        // 多线程操作示例
        ExecutorService executor = Executors.newFixedThreadPool(4);
        for (int i = 0; i < 4; i++) {
            executor.execute(() -> {
                for (int j = 0; j < 1000; j++) {
                    // 线程安全地设置位
                    bits.set(j % 100);
                    // 线程安全地清除位
                    if (j % 50 == 0) {
                        bits.clear(j % 100);
                    }
                }
            });
        }
        executor.shutdown();
        while (!executor.isTerminated()) {
            // 等待所有任务完成
        }
        System.out.println("Final state: " + bits);
    }
}

(3) 高级功能

// 原子操作:检查并设置位(CAS)
boolean success = bits.compareAndSwap(index, expectedValue, newValue);

// 并发统计:计算true位的数量
int count = bits.cardinality();

// 并发位运算:与另一个BitSet执行AND操作
ConcurrentBitSet other = new ConcurrentBitSet(100);
bits.and(other);

三、替代方案:原生BitSet的线程安全封装

1. 同步包装法

通过synchronized关键字或Lock接口对BitSet的操作进行同步:

BitSet bits = new BitSet();
Lock lock = new ReentrantLock();

// 写操作
lock.lock();
try {
    bits.set(10);
} finally {
    lock.unlock();
}

// 读操作
lock.lock();
try {
    boolean value = bits.get(10);
} finally {
    lock.unlock();
}

2. 原子变量法

使用AtomicLongArray实现更细粒度的并发控制(适用于简单位操作):

AtomicLongArray array = new AtomicLongArray(100);

// 设置第50位
int index = 50 / 64;
int bit = 50 % 64;
long mask = 1L << bit;

boolean success = array.compareAndSwap(index, array.get(index), array.get(index) | mask);

四、方案对比与选型建议

方案优点缺点适用场景
Eclipse Collections ConcurrentBitSet线程安全、API丰富、性能优异需引入第三方库高并发位操作、复杂位运算
同步包装法实现简单、兼容原生BitSet性能瓶颈、粗粒度锁低并发场景、简单位操作
原子变量法细粒度控制、无锁化实现复杂、仅支持简单位操作高性能要求、简单位标记

五、总结

  • 推荐优先使用Eclipse Collections的ConcurrentBitSet:在需要复杂位操作和高并发的场景下,其线程安全性和性能表现最佳。
  • 简单场景可选择同步包装:若仅需基础位操作且并发量较低,可通过synchronized或Lock快速实现线程安全。
  • 避免重复造轮子:第三方库已充分优化,无需自行实现复杂并发逻辑。

通过合理选择方案,可在多线程环境中高效、安全地处理位数据。

到此这篇关于Java中的ConcurrentBitSet使用小结的文章就介绍到这了,更多相关Java ConcurrentBitSet内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java使用NIO包实现Socket通信的实例代码

    Java使用NIO包实现Socket通信的实例代码

    本篇文章主要介绍了Java使用NIO包实现Socket通信的实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • 浅析Java类和数据结构中常用的方法

    浅析Java类和数据结构中常用的方法

    下面小编就为大家带来一篇浅析Java类和数据结构中常用的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • SpringBoot整合定时任务之实现Scheduled注解的过程(一个注解全解决)

    SpringBoot整合定时任务之实现Scheduled注解的过程(一个注解全解决)

    这篇文章主要介绍了SpringBoot整合定时任务之实现Scheduled注解的过程(一个注解全解决),本文通过使用场景分析给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • java调用oracle分页存储过程示例

    java调用oracle分页存储过程示例

    这篇文章主要介绍了java调用oracle分页存储过程,需要的朋友可以参考下
    2014-03-03
  • 如何解决java获取时间相差8小时的问题

    如何解决java获取时间相差8小时的问题

    最近使用new date()获取的时间会和真实的本地时间相差8小时。本文就详细的来介绍一下解决java获取时间相差8小时的问题,感兴趣的可以了解一下
    2021-09-09
  • Java 中如何使用 JavaFx 库标注文本颜色

    Java 中如何使用 JavaFx 库标注文本颜色

    这篇文章主要介绍了在 Java 中用 JavaFx 库标注文本颜色,在本文中,我们将了解如何更改标签的文本颜色,并且我们还将看到一个必要的示例和适当的解释,以便更容易理解该主题,需要的朋友可以参考下
    2023-05-05
  • 对HttpServletRequest中的Header进行增删实现过程

    对HttpServletRequest中的Header进行增删实现过程

    文章介绍了如何通过反射来修改和删除HttpServletRequest中的Header,以实现对外部请求数据的自定义处理,通过示例代码和分析,展示了如何在Tomcat和Undertow容器中实现这一功能
    2025-12-12
  • 关于Mybatis插入对象时空值的处理

    关于Mybatis插入对象时空值的处理

    这篇文章主要介绍了关于Mybatis插入对象时空值的处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • MyBatis字段名和属性名不一致的解决方法

    MyBatis字段名和属性名不一致的解决方法

    本文主要介绍了MyBatis字段名和属性名不一致的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Java8 Lamdba函数式推导

    Java8 Lamdba函数式推导

    这篇文章主要介绍了Java8 Lamdba函数式推导,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08

最新评论