Spring对每个bean提供了一个scope属性来表示该bean的作用域。它是bean的生命周期。
我们知道在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域。就是因为Spring对一些Bean(如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等)中非线程安全状态采用ThreadLocal进行处理,让它们也成为线程安全的状态,因为有状态的Bean就可以在多线程中共享了。
一般的Web应用划分为展现层、服务层和持久层三个层次,在不同的层中编写对应的逻辑,下层通过接口向上层开放功能调用。在一般情况下,从接收请求到返回响应所经过的所有程序调用都同属于一个线程。
ThreadLocal是解决线程安全问题一个很好的思路,ThreadLocal是一个为线程提供线程局部变量的工具类。它的思想也十分简单,就是为线程提供一个线程私有的变量副本,这样多个线程都可以随意更改自己线程局部的变量,不会影响到其他线程。不过需要注意的是,ThreadLocal提供的只是一个浅拷贝,如果变量是一个引用类型,那么就要考虑它内部的状态是否会被改变,想要解决这个问题可以通过重写ThreadLocal的initialValue()函数来自己实现深拷贝,建议在使用ThreadLocal时一开始就重写该函数。
ThreadLocal通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。在很多情况下,ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子 *** 作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
首先,你的确定数据的主键是否可以使用序列自增。如果可以那么你可以在插入数据的时候获取序列里的值,这样数据就不会重复了。
其次,可以创建一个公共方法,进行数据的插入 *** 作,并且方法类型声明为 static synchronized
类型,这样基本上就不会出现数据重复的现象了
最后,要看你是怎么获得待插入源数据了,这个获得数据源的方法也做成static synchronized的公
共方法。
你这个首先得分开。第一部分:你有很多线程在往数据池里面写入数据。那么,你的线程只管写数据,不用理会其他的数据。
第二部分:你的另外的线程(这里可以用spring的job定时器启动),这部分只管往数据库写入数据,至于写入的条件,你可以判断数据池的数据是否达到写入的标准。这里的线程可以配置为启动一次就一直运行,或者是隔多少秒继续运行。这样可以提高效率。
第三部分:数据池,这里的数据池一定要第一部分和第二部分的线程都能够访问,并且是唯一的。你可以写一个公用的类来进行控制。
大致就是这样的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)