TypechoJoeTheme

Clover 的博客

统计
登录
用户名
密码
/
注册
用户名
邮箱

CloverYou

日出于东却落于西,相识人海却散于席。

Servlet线程安全

2022-01-02
/
0 评论
/
35 阅读
/
正在检测是否收录...
01/02
  1. Servlet是单实例多线程环境下运行的。
  2. 什么时候程序存在线程安全问题?

    • 多线程并发
    • 有共享数据
    • 共享数据有修改操作
  3. 在JVM中,哪些数据可能会存在线程安全问题?

    • 局部变量内存空间不共享,一个线程一个栈,局部变量在栈内存中存储,局部变量不会存在线程安全问题。
    • 常量不会被修改,所以常量不会存在线程安全问题。
    • 所有线程共享一个堆

      • 堆内存中new出来的对象在其中存储,对象内部有“实例变量”,所以“实例变量”的内存多线程是共享的,实例变量多线程共享访问,并且涉及到修改操作的时候就会存在线程安全问题。
    • 所有线程共享一个方法区

      • 方法区中有静态变量,静态变量的内存也是共享的,若涉及到修改操作,静态变量也存在线程安全问题。
  4. 线程安全问题不只是体现在JVM中,还有可能发生在数据库中,例如:多个线程共享同一张表,并且同时去修改表中的记录,那么这些记录就存在线程安全问题,若要解决数据库中线程安全问题至少有两种方案:

    1. 在Java程序中使用synchronized关键字,线程排队执行,自然不会在数据库中并发,解决线程安全问题。
    2. 行级锁/悲观锁,在执行的sql语句后加上for update
    3. 事务隔离级别,例如:串行化
    4. 乐观锁
  5. 怎么解决线程安全问题?

    1. 不使用实例变量,尽量使用局部变量
    2. 若必须使用实例变量,那么我们可以考虑将该对象考虑将对象多例变量,一个线程一个Java对象,实例变量的内存也不会共享。
    3. 若必须使用单例,那就只能使用synchronized线程同步机制,线程一但排队执行,程序执行效率降低。
  6. Servlet怎么解决线程安全问题?

    1. 不使用实例变量,尽量使用局部变量
    2. Servlet必须是单例的,所以只能使用synchronized线程同步机制
JAVA随笔
朗读
赞(0)
版权属于:

Clover 的博客

本文链接:

https://www.ctong.top/index.php/archives/82/(转载时请注明本文出处及文章链接)

评论 (0)
CloverYou
日出于东却落于西,相识人海却散于席。
88 文章数
11 评论量
IP信息

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月

最新回复

  1. 缓存一致性 - 点击领取
    2022-01-06
  2. 宝宝
    2022-01-02

标签云