servlet-5(线程安全问题)

线程安全问题


(1)什么是线程安全问题
  同时满足以下两个条件,则会出现线程安全问题。
    A、存在多线程并发访问
    B、存在可修改的共享数据
  当多个线程同时修改同一个共享数据时,后修改的数据会将先修改的数据覆盖,对数据
先进行修改的用户读取到的不是自己修改后的数据,这就是线程安全问题。


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

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

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

 

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

  A、对于一般性的类,不要定义为单例的。除非项目有特殊需求,或该类对象属于重量
  级对象。所谓重量级对象是指,创建该类对象时需要占用较大的系统资源。
  B、无论类是否为单例类,尽量不使用静态变量。
  C、若需要定义为单例类,则单例类中尽量不使用成员变量。
  D、若单例类中必须要使用成员变量,则对成员变量的操作,可以添加串行化锁
  synchronized,实现线程同步。不过,最好不要使用线程同步机制。因为一旦操作
  进入串行化的排队状态,将大大降低程序的执行效率。

posted @ 2017-11-23 10:42  昵称什么的都不重要  阅读(140)  评论(0编辑  收藏  举报