zoukankan      html  css  js  c++  java
  • 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){ //需要同步的代码 }

  • 相关阅读:
    C#学习笔记10
    C#学习笔记9
    C#学习笔记8
    C#学习笔记7
    C#学习笔记6
    C#学习笔记5
    C#学习笔记4
    distinct() 去重复
    row_number over ()排序函数
    当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式。
  • 原文地址:https://www.cnblogs.com/roilat/p/3241032.html
Copyright © 2011-2022 走看看