• servlet线程同步问题-代码实现同步(转)


    从servlet的生命周期中,我们知道,当第一次访问某个servlet后,该servlet的实例就会常驻

    内存,以后再次访问该servlet就会访问同一个servlet实例,这样就带来多个用户去访问一个

    servlet的同步问题.

    比如: 我们在ServletContext中记录在线人员信息。这样就可能造成同时访问ServletContext的

    问题,如何解决,我做了一个小案例,很能说明问题,代码如下:

    public void doGet(HttpServletRequest req,HttpServletResponse res){
     
       try {
        
       synchronized(this){
        ServletContext sc=this.getServletContext();
        sc.setAttribute("test",new Integer(nums));
        }
     
          }
          catch (Exception ex) {
         
           ex.printStackTrace();
          }
    }

    //在需要同步的代码块中,加入synchronized(this){ //需要同步的代码 } ,就可以了。

    那么为什么这样作就可以达到同步了,这是因为每个java对象都有且只有一个同步锁,在任何时候

    ,最多允许一个线程拥有这把锁,当某个线程试图执行带有synchronized(this){ //需要同步的代码 }

    代码时,该线程必须得到this关键字对应的Servlet对象的锁,当没有被其它线程占用,那这个线程就可以

    获得这把锁,并执行synchronized(this){ //需要同步的代码 } 的代码, 如果该锁被别的线程使用,java虚拟机就会把这个线程放到servlet对象的锁池,该线程也就进入了阻塞状态,同时进入等待队列,直到获得该对象的锁,才开始运行。当然,也可能超时而放弃操作synchronized(this){ //需要同步的代码 }

  • 相关阅读:
    SVM+HOG特征训练分类器
    数字图像处理的基本原理和常用方法
    c++中二进制和整数转化
    目标检测——HOG特征
    相似图片搜索的原理和实现——颜色分布法
    测试文本文件大小
    Direct2D 图形计算
    Direct2D 如何关闭抗锯齿
    MFC窗口显隐
    CISP/CISA 每日一题 22
  • 原文地址:https://www.cnblogs.com/roilat/p/3241032.html
Copyright © 2020-2023  润新知