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