码迷,mamicode.com
首页 > 编程语言 > 详细

Servlet编程专题5之servlet线程安全问题

时间:2017-10-20 00:58:40      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:线程安全问题的满足条件   jvm中可能存在线程安全问题的数据分析   线程安全问题的解决方案   对线程安全问题的合理利用   

1、线程安全问题:

a、同时满足以下条件,可能会出现线程安全问题

i、存在多线程并发访问。

ii、存在可修改的共享数据。

-  当多个线程同时修改同一个共享数据时,后修改的数据会将先修改的数据覆盖,对数据先进行修改的用户读取的不是自己修改后的数据,这就是线程安全问题。


b、JVM中可能存在线程安全问题的数据分析:

i、栈内存数据分析:栈内存是多例的,即JVM会为每一个线程创建一个栈,所以其中的数据不是共享的。另外,方法中的局部变量存放在Stack的栈帧中,方法执行完毕,栈帧弹栈,局部变量消失。局部变量是局部的,而不是共享。所以栈内存中的数据是不存在线程安全问题的。

ii、堆内存数据分析:一个JVM中只存在一个堆内存,堆内存是共享的。被创建出的对象是存放在堆内存的,而存放在堆内存中的对象,实际上就是对象成员变量的值的集合。即成员变量是存放在堆内存的。堆内存中的数据是多线程共享的。所以堆内存中的数据是存在线程安全问题的。

iii、方法区数据分析:一个JVM中只存在一个方法区。静态变量和常量存放在方法区中,方法区是多线程共享的。常量是不能被修改的量,所以常量不存在线程安全问题。静态变量是多线程共享的,所以静态变量存在线程安全问题。


c、线程安全问题的解决方案:

-  若要解决数据的线程安全问题,则可按照下面思路考虑:

i、对于一般性的类,不要定义为单例的。除非项目中有特殊需求,或者该类对象数据为重量级对象。(所谓重量级对象是指,创建该类对象是需要占用较大的系统资源)

ii、无论是否是单例类,尽量不使用静态变量。

iii、若需要定义为单例类。则单例类中尽量不使用成员变量。(若使用成员变量,不提供修改变量的方式,该类对象的数据也不存在线程安全的问题)

vi、若单例类中必须使用成员变量,则对成员变量的操作,可以添加串行化锁synchronized,实现线程同步。不过,最好不要使用线程同步机制。因为一旦操作进入串行化的排队状态,将大大降低程序的执行效率。


2、Servlet的线程安全问题:Servlet是在单例多线程环境下运行的,其运行可能会出现线程安全问题。

为了避免线程安全问题的产生,对于Servlet的使用,一般是不声明成员变量的。若项目中要求必须声明成员变量(可修改),则只能够通过线程同步机制synchronized避免。


3、对线程安全问题的合理利用:

-  Servlet中的成员变量是每一个线程均可修改和访问的,所以可以利用这一点,实现计数器功能,用于统计当前Servlet的被访问的次数。



本文出自 “12392717” 博客,请务必保留此出处http://12402717.blog.51cto.com/12392717/1974394

Servlet编程专题5之servlet线程安全问题

标签:线程安全问题的满足条件   jvm中可能存在线程安全问题的数据分析   线程安全问题的解决方案   对线程安全问题的合理利用   

原文地址:http://12402717.blog.51cto.com/12392717/1974394

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!