线程安全小结

1.什么是线程安全问题?

当服务器同时接收多个访问的时候,服务器会为每个请求分配一个线程。而这多个线程如果调用了同一个方法,并且这个方法有全局变量,而这个方法也进行了写操作,将变量的值改变了。这个时候就会出现线程安全问题。请求会和想要的结果不一样,甚至会出现系统运行期报错。比如,对一个集合进行了循环,并更改了他的值,而这个时候因一个线程也进行遍历改变他的值也许就会出现运行时期异常。

2.解决办法。有两个

第一个办法:线程锁。 线程锁是说当多个线程同时访问一个方法的时候,就判断另一个线程有没有走完这个方法。如果其他的线程没有走完,这些线程只能排除等待。只有当一个线程走完的时候,另一个线程才可能运行。

第二个办法。threadlocal 本地线程。 将实例对象添加到threadlocal中,用的时候在threadlocal中获取

3.spring中线程安全问题。

springmvc中在创建controler的时候默认都是单例的,因为springmvc是基于方法的 展现层框架,当请求提交参数的时候会直接将变量添加到方法的成员变量中,所以只要不定义成员变量就不会出现线程安全问题。 当然一但定义了实例对象(成员变量)并进行了写操作就会出现线程安全问题。

spring在创建bean对象的时候默认认都是单例的,都会存在线程安全问题。应该注意。

4.strus中线程安全问题

使用struts的时候一般都会和spring一起使用,让spring来创建struts的action对象,而strusts在接收请求参数的时候,会用到成员变量,所有如果将action一但创建成单例的时候就会出现线程安全问题。所有在struts的时候一般都是会多例的。每一次请求都会创建一个action.

时间: 2024-12-20 18:18:31

线程安全小结的相关文章

iOS线程开发小结

/* 方法名决定是否开启新线程(async,sync),队列类型(全局队列,串行队列)决定开启多少条线程 1.快速线程调用 *开启后台线程执行任务 [self performSelectorInBackground:@selector(test) withObject:nil]; *回到主线程执行任务 [self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES]; 2.GCD

线程池小结2

关于线程池的介绍,请看上一篇博客:http://www.cnblogs.com/DarrenChan/p/5774921.html 1. 线程池的5中创建方式 1) Single Thread Executor : 只有一个线程的线程池,因此所有提交的任务是顺序执行, 代码: Executors.newSingleThreadExecutor() 2)  Cached Thread Pool : 线程池里有很多线程需要同时执行,老的可用线程将被新的任务触发重新执行,如果线程超过60秒内没执行,那

单例模式的线程安全问题小结

单例会带来什么问题? 如果多个线程同时调用这个实例,会有线程安全的问题 单例一般用在什么地方? 单例的目的是为了保证运行时只有唯一的一个实例,最常用的地方比如拿到数据库的连接,或者Spring的中创建BeanFactory操作,而这些操作都是调用他们的方法来执行某个特定的动作. 首先先来认识下两种模式:  恶汉式  懒汉式 public class MyFactory { // //饿汉式 立即创建 // private static MyFactory instance = new MyFac

Spring单例与线程安全小结

转:http://www.cnblogs.com/doit8791/p/4093808.html 一.Spring单例模式与线程安全 Spring框架里的bean,或者说组件,获取实例的时候都是默认的单例模式,这是在多线程开发的时候要尤其注意的地方. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多个线程会并发执行该请求多对应的业务逻辑(成员方法),此时

ThreadPool线程池 小结

ThreadPool类提供一个线程池,该线程池可用于发送工作项.处理异步 I/O.代表其他线程等待以及处理计时器 线程池通过为应用程序提供一个由系统管理的辅助线程池使您可以更为有效地使用线程.一个线程监视排到线程池的若干个等待操作的状态.当一个等待操作完成时,线程池中的一个辅助线程就会执行对应的回调函数 托管线程池中的线程为后台线程,即它们的 IsBackground 属性为 true.这意味着在所有的前台线程都已退出后,ThreadPool 线程不会让应用程序保持运行 也可以将与等待操作不相关

线程知识点小结

一.线程创建方式有两种:继承Thread类和实现Runnable接口 1.继承Thread,需要重写run方法,因为Thread类中的run方法什么也没有做.如果想开启新线程,光创建线程对象是远远不够的,只有执行线程对象的start()方法,才能在栈中开启新线程,并执行run()方法.如果没有调用start()方法,仅仅只是使用ThreadDemo 调用run()方法,跟一般对象调用函数没有任何区别,不会开启新的线程. public class ThreadDemo extends Thread

linux 线程函数小结

由于主线程已经开始跑了,次线程还在使用串口打印需要一点时间,因此打印的都是重复的. #include "pthread.h" #include "stdio.h" #include "stdlib.h" static void * thread_function(void * arg ) { // printf("%s %d\n ",__FUNCTION__ , (int)arg ); printf("%s %d\n

Java多线程(二) —— 线程安全、线程同步、线程间通信(含面试题集)

一.线程安全 多个线程在执行同一段代码的时候,每次的执行结果和单线程执行的结果都是一样的,不存在执行结果的二义性,就可以称作是线程安全的. 讲到线程安全问题,其实是指多线程环境下对共享资源的访问可能会引起此共享资源的不一致性.因此,为避免线程安全问题,应该避免多线程环境下对此共享资源的并发访问. 线程安全问题多是由全局变量和静态变量引起的,当多个线程对共享数据只执行读操作,不执行写操作时,一般是线程安全的:当多个线程都执行写操作时,需要考虑线程同步来解决线程安全问题. 二.线程同步(synchr

Java线程:线程的同步与锁

一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. public class Foo {     private int x = 100; public int getX() {         return x;     } public int fix(int y) {         x = x - y;         return x;     } }