`
deepinmind
  • 浏览: 450758 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
1dc14e59-7bdf-33ab-841a-02d087aed982
Java函数式编程
浏览量:41549
社区版块
存档分类
最新评论

ThreadSafe:诊断并发问题的利器

阅读更多
听到ThreadSafe这个东西我的第一反应就是, ”天啊,又出了一个静态代码分析工具”。在内部开发中引入了像PMD或者FindBugs这类的工具,又花了不少时间优化成零警告后,我感觉已经不再需要其它的工具了。不过我真的错了。

ThreadSafe这个工具跟别的代码分析工具一样,但有一点不同,它更专注于Java开发中一个非常重要的领域——并发。Contemplate的小伙伴们太给力了,他们注意到了需要有这么个工具,能快速定位到代码中可能存在的并发,多线程相关的问题。

这个工具有两种使用方法——Eclipse插件或者Sonar插件。我用了下它的Eclipse插件去分析了inspectIT的源码,我们开发的一款免费的性能分析的工具。装这个插件,分析完所有的代码,一共才花了不到3分钟,就得到了一些很有价值的结果。

我看到这些结果的第一印象就是,“别说,这些警告还真挺到位”。我讨厌那些报告了一堆信息,最后没多少有用的工具。ThreadSafe目前有18条规则,而且这些规则都定义的非常仔细巧妙。每条规则的文档也非常详细,每个人都能看明白具体的警告信息是什么意思。

在我们的工程中,ThreadSafe发现了9大类一共44个潜在的问题。出现最多的问题是不一致同步(15)以及非原子调用get/check/put(10)。修复这些问题用不了多长时间,因为只要你知道哪有问题,如何能解决,很快你就能搞定了。

下面给出一个使用ThreadSafe的例子,我把我们类里的一个问题的描述进行了截图,并且把相关的代码也一并放出来:




public abstract class AbstractSensorConfig {


     private List<PropertyPathStart> propertyAccessorList = new CopyOnWriteArrayList<PropertyPathStart>();

    public void setPropertyAccessorList(List<PropertyPathStart> propertyAccessorList) {
               this.propertyAccessorList = propertyAccessorList;
        } 



正如你所看到的,我们很容易就发现有一个类,它用一个线程安全的列表初始化了一个字段,但又定义了一个public的setter方法来修改这个值,而这个方法接受的是一个list接口。这意味这个线程安全的列表很容易就会被任何类型的列表实现所覆盖,这会导致同步的问题,因为这个类期望操作的是一个线程安全的list。多亏了有了TheadSafe,这些问题都轻松的解决了。

我认为正确的使用并发是所有高性能程序的基础,我也相信ThreadSafe可以极大的减少并发的错误实现带来的隐患。因此,每个工程都应该考虑使用像ThreadSafe这样的工具,在开发阶段就把问题及早的解决掉。


译注:本文只是ThreadSafe的简单介绍,更详细的使用方法可以参考官方文档或者http://www.infoq.com/articles/Java-Concurrency-Static-Analysis-with-ThreadSafe


原创文章转载请注明出处:http://it.deepinmind.com

英文原文链接
2
2
分享到:
评论

相关推荐

    std::thread 并发测试

    这个“std::thread 并发测试”项目旨在探索和评估在不同线程数量下的程序性能,并关注如何有效地同步线程以避免竞态条件和数据不一致性。 1. **最优线程数**:在多线程环境中,不是线程越多性能越好。每个线程都...

    Java诊断利器Arthas排查问题实践.pptx

    Java 诊断利器 Arthas 排查问题实践 Arthas 是 Alibaba 开源的 Java 诊断工具,于 2018 年 9 月开源,目前在 Github 上获得了 11,000 多个星标。 Arthas 的主要功能特性包括查看类加载情况、反编译类、热更新类、...

    java并发编程与实践

    在Java编程领域,并发编程是一项核心技能,尤其是在大型系统或分布式应用中,高效地处理多线程和并发操作是至关重要的。...这份资料对于理解Java并发原理、优化并发代码和解决并发问题具有极大的价值。

    object_threadsafe:我们将任何对象的线程安全性和std :: shared_mutex的速度提高10倍,以实现读取率> 85%的无锁算法的速度

    `object_threadsafe` 库适用于对性能有严格要求的 C++ 应用,尤其是那些并发读取操作非常频繁的场景,如大数据处理、实时系统或游戏服务器。通过利用 C++11 和 C++14 的特性,这个库可以帮助开发者创建出既安全又...

    艾编程coding老师:JUC 并发编程 + 底层原理.pdf

    JUC(java.util.concurrent)是Java提供的一个并发编程工具包...要掌握JUC并发编程及其底层原理,除了通过阅读官方文档和源码学习外,还需要大量实践和经验积累,才能够真正理解和应用JUC中的并发工具来解决实际问题。

    thread_safe.rar

    在Ruby编程语言中,`thread_safe`是一个非常重要的库,它提供了一组工具来帮助开发者处理并发环境中的数据同步问题。 在Ruby中,标准库并不提供全局的线程安全保证,这意味着程序员需要自己处理线程间的同步。`...

    php-5.5.13-Win32-VC11-x86(Thread Safe)

    VC11 x86 Thread Safe (2014-May-28 19:57:18) Zip [18.56MB] sha1: 67d90888d7ae37029452d9b2e1135d9e3a087bd3 转自:http://windows.php.net/download/

    Java并发编程:设计原则与模式(第二版).rar

    2. **Java并发API**:Java提供了丰富的并发API,如`Thread`、`Runnable`、`ExecutorService`和`Future`等。这些API是Java并发编程的核心,书中会详细解析它们的使用方法和应用场景。 3. **线程安全**:线程安全是...

    ThreadSafe:创建线程安全类示例

    线程安全该项目包含几个关于如何创建线程安全类的示例。 如果您有兴趣了解更多关于 Java 和编程的知识,请随时关注我的博客:

    PHP 5.3 (5.3.0) VC6 x86 Non Thread Safe

    【PHP 5.3 (5.3.0) VC6 x86 Non Thread Safe】是PHP的一个特定版本,适用于32位(x86)系统,并且是基于Visual C++ 6 (VC6)编译器构建的非线程安全(Non Thread Safe,NTS)版本。这个版本在设计时并未考虑多线程...

    window下php5.5 Thread Safe (TS) vc11 x86 的mongo扩展

    window下php5.5 Thread Safe (TS) x86 的mongo扩展 1.下载完你需要的二进制包后,解压压缩包,将'php_mongo.dll'文件添加到你的PHP扩展目录中(ext)。ext目录通常在PHP安装目录下的ext目录。 2.打开php配置文件 ...

    PHP 5.3 5.3 Non Thread Safe (NTS) x86 APC加速器

    PHP 5.3 5.3 Non Thread Safe (NTS) x86 APC加速器 重命名为php_apc.dll 2.复制php_apc.dll到你的PHP的模块文件夹里,比如c:/php/extensions (PHP4.X)或者c:/php/ext(PHP5.X) 3.打开php.ini.搜索;extension=...

    JAVA并发编程经典书籍

    3. **共享数据与线程安全**(03章):讨论共享数据在并发环境下的问题,如数据竞争和死锁,并介绍Java提供的线程安全机制,如synchronized关键字、volatile变量、Atomic类等。 4. **并发工具类**(04章):介绍Java...

    实战Java高并发程序设计(高清版)

    3. **并发设计模式**:书里可能讨论了如何使用各种并发设计模式来解决并发问题,比如生产者消费者模型、双检锁(DCL)、读写锁(ReentrantReadWriteLock)等。 4. **并发工具类**:Java并发包(java.util....

    java高并发编程第一版

    1. **并发基础**:首先,书中会介绍并发编程的基本概念,包括进程与线程的区别,以及Java中的Thread类和Runnable接口。了解线程的生命周期、同步和协作机制是学习并发的基础。 2. **Java内存模型**:Java内存模型...

    Java并发编程:设计原则与模式(第二版)-3

    书中详细介绍了各种并发设计模式,如生产者消费者模型(BlockingQueue)、读写锁模式(ReadWriteLock)、双检查锁定模式(Double-Checked Locking)、线程池模式(ThreadPoolExecutor)等,这些都是解决并发问题的...

    threadsafe.zip

    "threadsafe.zip"这个压缩包显然包含了关于如何在Spring Boot环境中实现线程安全的代码实例,主要涉及到`synchronized`, `volatile`, 和`atomic`这三个关键关键字的使用。 首先,我们来探讨`synchronized`关键字。`...

    (PDF带目录)《Java 并发编程实战》,java并发实战,并发

    7. **并发设计模式**:书中也会涵盖一些经典的并发设计模式,如生产者消费者模型、读写锁、双检锁等,这些都是解决并发问题的有效工具。 8. **并发异常处理**:在并发环境下,异常处理变得更为复杂,书中有专门章节...

    C#使用队列(Queue)解决简单的并发问题

    在本文中,我们将深入探讨如何使用C#中的队列数据结构(Queue)来解决简单的并发问题。队列是一种线性数据结构,遵循先进先出(FIFO)的原则,即第一个进入的元素也将是第一个离开的元素。这种特性使得队列在处理...

Global site tag (gtag.js) - Google Analytics