繁体   English   中英

同步块未在servlet中执行

[英]synchronized block not executing in servlet

我正在尝试学习和了解Java Servlet。 我有一个正在使用的示例,但是由于某些原因,页面在碰到同步块时会停止加载。

package org.recipe.ch01;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "CurrentDateAndTime", urlPatterns = {"/CurrentDateAndTime"})
public class CurrentDateAndTime extends HttpServlet
{
Date currDateAndTime;

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
    response.setContentType("text/html;charset=UTF-8");
    try (PrintWriter out = response.getWriter())
    {
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet CurrentDateAndTime</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Servlet CurrentDateAndTime at " + request.getContextPath() + "</h1>");
        out.println("<br/>");
        synchronized (currDateAndTime)
        {
            currDateAndTime = new Date();
            out.println("The current date and time is: " + currDateAndTime);
        }
        out.println("</body>");
        out.println("</html>");
    }
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
    processRequest(request, response);
}

@Override
protected void  doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
    processRequest(request, response);
}
}

该网页将加载所有内容,直到第29行。我正在使用GlassFish 4.1.1。

我有什么想念的吗?

如注释中所述,此代码是荒谬的,没有必要将当前日期时间设置为实例成员。

在输入同步块之前,必须先评估parse中关键字之后的括号中的表达式,以便确定需要获取哪些锁。 每当线程尝试进入该块时都会执行此评估。 如果表达式的计算结果为null(在此执行此操作是因为尚未初始化实例变量),则将引发NullPointerException。

更改内容线程已锁定的变量的值是一个非常糟糕的主意。 当执行该块的线程更改了变量的值时,其他尝试获取该锁的线程所评估的表达式将解析为与第一线程当前持有的对象不同的对象,从而使第一线程持有的锁无关紧要,并允许第二个线程获取新对象的锁并继续执行,即使第一个线程未完成也是如此,如果在同步块中发生任何重要的事情,则可能造成灾难性的后果(与发布的示例不同)。 即使通过确保变量不为null来使它起作用,这也是避免的好模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM