servlet线程安全问题
1.servlet是单实例多线程环境下运行的。
2.什么时候程序存在线程安全问题。
-多线程并发;
-有共享数据;
-共享数据有修改操作;
3.在JVM中,哪些数据会存在线程安全问题?
-局部变量内存空间不共享,一个线程一个栈,局部变量在栈中存储,局部变量不会存在线程安全问题;
-常量不会被修改,所以常量不会存在线程安全问题;
-所有线程共享一个堆;
*堆内存中new出来的对象在其中存储,对象内部有"实例变量",所以"实例变量"的内存多线程是共享的,
实例变量多线程共同访问,并且涉及到修改操作的时候就会存在线程安全问题。
-所有线程共享一个方法区
*方法区中有静态变量,静态变量的内存也是共享的,如涉及到修改操作,静态变量也存在线程安全问题。
4.线程安全问题不止体现在JVM中,还有可能发生在数据库中;例如多线程共享一张表,并且同时取修改表中的一些记录,
那么这些记录就存在线程安全问题。
怎么解决数据表中数据的线程安全问题呢?
-第一种方案:在java程序中使用synchronized关键字,线程排队执行,自然不
在数据库中并发,解决线程安全问题。
-第二种方式:行级锁【悲观锁】
-第三种方案:事务隔离级别
-第四种方案:乐观锁
5.怎么解决线程安全问题?
5.1 不使用实例变量,尽量使用局部变量
5.2 若必须使用实例变量,那么我们可以考虑该对象变成多例对象,一个线程一个java对象,实例变量的内存也不会共享
5.3 若必须使用单利,那就只能使用synchronized线程同步机制,线程一旦排队执行,则吞吐量降低,降低用户体验
6.怎么解决 servlet的线程安全问题?
6.1不使用实例变量,尽量使用局部变量。
6.2 Servlet必须是单利的,所以剩下的方式只能考虑使用synchronized,线程同步机制。
1.servlet是单实例多线程环境下运行的。
2.什么时候程序存在线程安全问题。
-多线程并发;
-有共享数据;
-共享数据有修改操作;
3.在JVM中,哪些数据会存在线程安全问题?
-局部变量内存空间不共享,一个线程一个栈,局部变量在栈中存储,局部变量不会存在线程安全问题;
-常量不会被修改,所以常量不会存在线程安全问题;
-所有线程共享一个堆;
*堆内存中new出来的对象在其中存储,对象内部有"实例变量",所以"实例变量"的内存多线程是共享的,
实例变量多线程共同访问,并且涉及到修改操作的时候就会存在线程安全问题。
-所有线程共享一个方法区
*方法区中有静态变量,静态变量的内存也是共享的,如涉及到修改操作,静态变量也存在线程安全问题。
4.线程安全问题不止体现在JVM中,还有可能发生在数据库中;例如多线程共享一张表,并且同时取修改表中的一些记录,
那么这些记录就存在线程安全问题。
怎么解决数据表中数据的线程安全问题呢?
-第一种方案:在java程序中使用synchronized关键字,线程排队执行,自然不
在数据库中并发,解决线程安全问题。
-第二种方式:行级锁【悲观锁】
-第三种方案:事务隔离级别
-第四种方案:乐观锁
5.怎么解决线程安全问题?
5.1 不使用实例变量,尽量使用局部变量
5.2 若必须使用实例变量,那么我们可以考虑该对象变成多例对象,一个线程一个java对象,实例变量的内存也不会共享
5.3 若必须使用单利,那就只能使用synchronized线程同步机制,线程一旦排队执行,则吞吐量降低,降低用户体验
6.怎么解决 servlet的线程安全问题?
6.1不使用实例变量,尽量使用局部变量。
6.2 Servlet必须是单利的,所以剩下的方式只能考虑使用synchronized,线程同步机制。