有没有想过:
1、你的所有数据库操作curd方法都不是线程安全的
2、你的所有业务类都不是线程安全的
3、这不是用什么线程安全集合能解决的事情
4、业务是复杂的,需要同步的变量牵扯太多东西
5、考虑同步的时候又要去注意锁的粒度,范围
之所以没把线程安全当一回事,我觉得
1、并发量不高没有感觉到危机
2、出现了并发问题,但是由于业务的一些特性这些并发问题变成了小问题而且没有被察觉到
3、没有测试
实际上上面说的终究归咎于没有测试,当然提前要有这个意识,明白业务可能会出现什么问题。
举个例子来说:你在开开心心的写业务逻辑:
//变量
//方法{
//进门
//出门
}
方法很简单,进门之后出门,变量保存当前状态。
在你开开心心的打完收工的时候,有没有想过写的东西实际上就是一颗定时炸 弹:非线程安全
这个还只是一个非常简单的例子,可能你一会儿就看出来怎么去加锁让他变成线程安全的方法,这是件好事。
但是问题来了:这个例子只是非常初级的案例,回到各自的业务代码上来这种问题比比皆是。而且很多变量牵涉很多其他操作,你想把一个变量操作变成线程安全的,结果你发现这个变量又和其他变量有关。到最后你想把整个方法加锁,当然这种做法是极端不推荐的。
十几个方法操作同一个对象里面的若干个变量。给方法加锁?对象加锁?变量加锁?所多久?有没有想过这个加锁的快里面刚好有一个数据库操作,这个锁又会因为这个耗时的数据库操作影响多久?
虽然我也想把这些变量的操作方法写到对象里面去,然后给这个方法加锁。这是相当好的办法,效率也很高。
但是不是什么事情都事与愿违,我觉得我在线程安全问题上有些神经质了。
问题依然存在,不会因为你不神经质就让问题消失。你知道那里有个不定时炸 弹,在某个情况下可能就是因为一个小小的变量的值不正常导致流程错误,然后一堆人傻乎乎的被卡死在那里。
求指点,求打醒。我想知道大家在处理实际业务中的时候是怎么解决这种问题的,而不是在某个变量上加同步块。
分享到:
相关推荐
Servlet/JSP 技术由于其多线程运行而具有很高的执行效率,但这也意味着需要非常细致地考虑多线程的安全性问题。 Servlet 的多线程机制是建立在 Java 多线程机制之上的。Servlet 容器会自动使用线程池等技术来支持...
4. 避免在多线程环境中直接使用HashMap:如果你确定不需要在多线程环境下共享HashMap,那么可以考虑局部变量的方式,只在单个线程中使用HashMap,这样就无需担心线程安全问题。 总结起来,理解HashMap的线程不安全...
什么是线程安全? 答:线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等...
本文将深入探讨在多线程环境中使用List时遇到的非线程安全问题,并提供相应的解决方案和最佳实践。 List是.NET框架中常用的一个动态数组,它提供了方便的增删改查操作。然而,List并未设计为线程安全的容器,这意味...
mysql是线程不安全的,mysql不是线程安全的,多线程共用同一个mysql连接是会崩溃的 QT的QSqlDatabase是基于mysql的,所以...现讲明mysql为什么是线程不安全的,以及在多线程环境下如何使用mysql,QSqlDatabase不崩溃的方法.
在当今的计算机科学领域,线程作为操作系统调度的最小单元,它允许一个进程同时派生出多个线程。这些线程独立执行,共享进程资源...开发人员应当时刻铭记线程安全的重要性,并将其作为设计多线程程序时的首要考虑因素。
ThreadLocal变量是另一种保证线程安全的方法,它为每个线程提供了一个变量的副本,使得每个线程都可以独立地修改自己的副本,而不会影响其他线程。ThreadLocal适用于那种线程间不需要共享数据,或者共享的数据需要以...
阿里面试题:ConcurrentHashMap为什么是线程安全的? ConcurrentHashMap,其实是线程安全的HashMap,所以阅读ConcurrentHashMap,建议 先阅读一下两篇介绍HashMap的文章 你真的懂大厂面试题:HashMap吗? jdk1.7 ...
8. 线程局部变量(ThreadLocal):为每个线程创建独立的变量副本,避免了线程安全问题,但要注意,ThreadLocal变量会在线程结束时被垃圾回收,如果不及时清理可能导致内存泄漏。 测试线程安全通常包括模拟并发环境...
在IT行业中,尤其是在开发高并发应用时,线程安全是一个至关重要的问题。"C# 高效线程安全,解决多线程写txt日志类.zip" 提供了一个专门用于多线程环境下写入txt日志文件的解决方案,确保了在并发写入时的数据一致性...
为了解决这个问题,我们可以使用委托的BeginInvoke或Invoke方法,它们会在UI线程上执行指定的方法,确保了对UI元素的访问是线程安全的。 具体到项目"WinThreadSetProValue",我们可以推测其包含了一个Windows窗体...
在C#编程中,线程安全是多线程应用程序中至关重要的一个方面,尤其是在处理共享资源如文本日志文件时。本主题将深入探讨如何在C#中创建一个高效的线程安全日志类,用于在多线程环境中安全地写入txt日志。 首先,...
在这之前我只记住了StringBuilder不是线程安全的,StringBuffer是线程安全的这个结论,至于StringBuilder为什么不安全从来没有去想过。 分析 在分析这个问题之前我们要知道StringBuilder和StringBuffer的内部实现跟S
5. **线程局部存储(Thread Local Storage)**:每个线程都有自己独立的连接实例,避免了线程间共享连接带来的问题。但这可能增加内存消耗,适用于连接资源有限的情况。 在`RedisClient`这个类中,我们可以设计以下...
在多线程编程中,线程安全是至关重要的一个概念,它确保了多个线程并发访问同一资源时,不会导致数据的不一致性和错误。在C++中,我们可以使用互斥量(Mutex)来实现线程安全的数据结构,如队列。本主题将详细介绍...
### servlet与Struts action线程安全问题分析 #### 一、引言 随着互联网应用的不断普及和发展,基于Servlet和JSP技术的应用程序在企业级应用中占据着重要的位置。Servlet作为一种常用的技术栈,因其多线程运行特性...
这样,在多线程环境下,每个线程都可以安全地访问实例,而不需要考虑线程安全问题。 在 Spring 框架中,单例模式是默认的作用域,即在整个应用程序生命周期中,只有一个实例存在。为了确保线程安全,Spring 使用 ...
然而,当在多线程环境中使用SQLite时,需要注意一些关键问题以确保数据的安全性和一致性。以下是四个重要的考虑因素: 1. **线程安全**: SQLite本身并不提供完全的线程安全,这意味着在不同线程中并发访问数据库...