使用Javaweb实现在线调查问卷系统

简介: 使用Javaweb实现在线调查问卷系统

项目编号:BS-PT-014


开发技术: jsp/servlet   前端技术:jquery+layui

开发工具:IDEA/Eclipse

数据库:MYSQL5


功能介绍:


    在线调查问卷系统:实现了调查问卷管理,调查项管理,问卷审核管理,问卷统计管理,用户管理,友情链接管理等功能。问卷支持单选,多选,问答多种调查题型。支持公开问卷和私有问卷等类型。功能完整,运行无误。


部分功能截图:


  首页:

image.png

调查问卷填写:

20200723082104659.png

问卷列表展示:

image.png

后台管理界面:

image.png

网站系统配置:

image.png

问卷管理:

image.png

友情连接管理:

image.png

问卷添加:

20200723082538644.png

问卷审核:问卷添加后,审核通过才能使用

image.png

问卷统计:统计每个调查问卷的情况

image.png

用户管理:

image.png

友情连接管理:

image.png

以上就是网络在线调查问卷系统的基本功能,可以根据需求进行调整。基于JSP实现的在线调查问卷系统。

package com.ec.survey.ctrl;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ec.survey.dao.AdminDAO;
import com.ec.survey.dao.DAOFactory;
import com.ec.survey.dao.QuestionDAO;
import com.ec.survey.dao.SurveyDAO;
import com.ec.survey.dto.Admin;
public class AdminManage extends HttpServlet {
  /**
   * The doGet method of the servlet. <br>
   *
   * This method is called when a form has its tag value method equals to get.
   * 
   * @param request the request send by the client to the server
   * @param response the response send by the server to the client
   * @throws ServletException if an error occurred
   * @throws IOException if an error occurred
   */
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
  doPost(request, response);
  }
  /**
   * The doPost method of the servlet. <br>
   *
   * This method is called when a form has its tag value method equals to post.
   * 
   * @param request the request send by the client to the server
   * @param response the response send by the server to the client
   * @throws ServletException if an error occurred
   * @throws IOException if an error occurred
   */
  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    String mutex1="";
    //String mutex2="";
    String op=request.getParameter("op");
    if("AddAdmin".equals(op)){
      String username=request.getParameter("username");
      String pwd=request.getParameter("pwd");
      AdminDAO dao=DAOFactory.getAdminDAO();
      Admin admin=new Admin();
      admin.setA_user(username);
      admin.setA_pass(pwd);
      boolean ret1=dao.addAdmin(admin);
      if(ret1)
        response.sendRedirect("../admin/AdminList.jsp");
      else
        response.sendRedirect("../admin/OpResult.jsp?op=default&ret=false&words="+URLEncoder.encode("增加管理员出错!请联系管理员", "UTF-8") );
    }
    else if("DelAdmin".equals(op)){
      Long aid=Long.valueOf(request.getParameter("aid"));
      AdminDAO dao=DAOFactory.getAdminDAO();
      boolean ret1=dao.delAdmin(aid);
      if(ret1)
        response.sendRedirect("../admin/AdminList.jsp");
      else
        response.sendRedirect("../admin/OpResult.jsp?op=default&ret=false&words="+URLEncoder.encode("删除管理员出错!请联系管理员", "UTF-8"));
    }else if("EditAdmin".equals(op)){
      Long aid=Long.valueOf(request.getParameter("aid"));
      String oldpwd=request.getParameter("oldpwd");
      String pwd=request.getParameter("pwd");
      String username=request.getParameter("username");
      AdminDAO dao=DAOFactory.getAdminDAO();
      if(dao.checkPwd(username, oldpwd)!=true){
        response.sendRedirect("../admin/OpResult.jsp?op=default&ret=false&words="+URLEncoder.encode("旧密码错误", "UTF-8"));
        return;
      }
      synchronized(mutex1){
      Admin admin=dao.findAdmin(aid);
      admin.setA_user(username);
      admin.setA_pass(pwd);
      boolean ret1=dao.updateAdmin(admin);
      if(ret1)
        response.sendRedirect("../admin/AdminList.jsp");
      else
        response.sendRedirect("../admin/OpResult.jsp?op=default&ret=false&words="+URLEncoder.encode("编辑管理员出错!请联系管理员", "UTF-8"));
      }
    }
  }
}

package com.ec.survey.ctrl;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ec.survey.dao.ConfigDAO;
import com.ec.survey.dao.DAOFactory;
import com.ec.survey.dto.Config;
public class ConfigManage extends HttpServlet {
  /**
   * Constructor of the object.
   */
  public ConfigManage() {
    super();
  }
  /**
   * Destruction of the servlet. <br>
   */
  public void destroy() {
    super.destroy(); // Just puts "destroy" string in log
    // Put your code here
  }
  /**
   * The doGet method of the servlet. <br>
   *
   * This method is called when a form has its tag value method equals to get.
   * 
   * @param request the request send by the client to the server
   * @param response the response send by the server to the client
   * @throws ServletException if an error occurred
   * @throws IOException if an error occurred
   */
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doPost(request,response);
  }
  /**
   * The doPost method of the servlet. <br>
   *
   * This method is called when a form has its tag value method equals to post.
   * 
   * @param request the request send by the client to the server
   * @param response the response send by the server to the client
   * @throws ServletException if an error occurred
   * @throws IOException if an error occurred
   */
  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    ConfigDAO configdao=DAOFactory.getConfigDAO();
    Config config=new Config();
    config.setCSiteName(request.getParameter("siteName"));
    config.setCSiteUrl(request.getParameter("siteURL"));
    config.setCIsOpen(Boolean.valueOf(request.getParameter("siteOpen")));
    config.setCCloseWord(request.getParameter("closeWord"));
    config.setCopyright(request.getParameter("copyright"));
    boolean ret=configdao.updateConfig(config);
    if (ret==true)
      response.sendRedirect("../admin/OpResult.jsp?op=SysConfig&ret=true");
    else
      response.sendRedirect("../admin/OpResult.jsp?op=SysConfig&ret=false");
  }
  /**
   * Initialization of the servlet. <br>
   *
   * @throws ServletException if an error occurs
   */
  public void init() throws ServletException {
    // Put your code here
  }
}
package com.ec.survey.ctrl;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ec.survey.dao.DAOFactory;
import com.ec.survey.dao.QuestionDAO;
import com.ec.survey.dto.Question;
public class QuestionManage extends HttpServlet {
  /**
   * The doGet method of the servlet. <br>
   *
   * This method is called when a form has its tag value method equals to get.
   * 
   * @param request the request send by the client to the server
   * @param response the response send by the server to the client
   * @throws ServletException if an error occurred
   * @throws IOException if an error occurred
   */
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
  doPost(request,response);
  }
  /**
   * The doPost method of the servlet. <br>
   *
   * This method is called when a form has its tag value method equals to post.
   * 
   * @param request the request send by the client to the server
   * @param response the response send by the server to the client
   * @throws ServletException if an error occurred
   * @throws IOException if an error occurred
   */
  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
     String mutex = ""; 
     String mutex1 = ""; 
     String mutex2 = ""; 
    String op=request.getParameter("op");
    if("AddQuestion".equals(op)){
      String sid=request.getParameter("sid");
      String type=request.getParameter("type");
      String qhead=request.getParameter("qHead");
      String qbody=request.getParameter("qBody"); 
      String qresult=request.getParameter("qResult");
      String qimg=request.getParameter("qImg");
      Question question=new Question();
      question.setSurvey(Long.valueOf(sid));
      question.setQType(Long.valueOf(type));
      question.setQHead(qhead);
      question.setQBody(qbody);
      question.setQResult(qresult);
      question.setQImg(qimg);
      question.setQOrder(0L);
      String [] qbodys=qbody.split("&\\$\\$&");
      String spliter="";
      for(int i=1;i<qbodys.length;i++)
        if(i==qbodys.length-1)
          spliter=spliter+"null&null";
        else
          spliter=spliter+"null&";
      question.setQJdtz(spliter);
      QuestionDAO dao=DAOFactory.getQuestionDAO();
      boolean ret=dao.addQuestion(question);
      if(ret==true)
        response.sendRedirect("../admin/OpResult.jsp?op=Question&ret=true&sid="+sid);
      else{
        response.sendRedirect("../admin/OpResult.jsp?op=Question&ret=false");
      }
    }else if("DelQuestion".equals(op)){
      String sid=request.getParameter("sid");
      String qid=request.getParameter("qid");
      QuestionDAO dao=DAOFactory.getQuestionDAO();
      boolean ret=dao.delQuestion(Long.valueOf(qid));
      if(ret==true)
        response.sendRedirect("../admin/QuestionAdmin.jsp?sid="+sid);
      else
        response.sendRedirect("../admin/OpResult.jsp?op=Question&ret=false");
    }else if("EditQuestion".equals(op)){
      String sid=request.getParameter("sid");
      String qid=request.getParameter("qid");
      //System.out.println(qid);
      String type=request.getParameter("type");
      String qhead=request.getParameter("qHead");
      String qbody=request.getParameter("qBody"); 
      String qimg=request.getParameter("qImg");
      QuestionDAO dao=DAOFactory.getQuestionDAO();
      synchronized(mutex){
      Question question=dao.findQuestion(Long.valueOf(qid));
      //System.out.println(question==null);
      question.setQType(Long.valueOf(type));
      question.setQHead(qhead);
      question.setQBody(qbody);
      question.setQImg(qimg);
      String [] qbodys=qbody.split("&\\$\\$&");
      String spliter="";
      for(int i=1;i<qbodys.length;i++)
        if(i==qbodys.length-1)
          spliter=spliter+"null&null";
        else
          spliter=spliter+"null&";
      question.setQJdtz(spliter);
      question.setQOrder(0L);
      boolean ret=dao.updateQuestion(question);
      if(ret==true)
        response.sendRedirect("../admin/OpResult.jsp?op=Question&ret=true&sid="+sid);
      else
        response.sendRedirect("../admin/OpResult.jsp?op=Question&ret=false");
      }
    }else if("setJD".equals(op)){
      String sid=request.getParameter("sid");
      String qid=request.getParameter("qid");
      int jd_count=Integer.parseInt(request.getParameter("jd_count"));
      List<String> list=new ArrayList<String>();
      for(int j=0;j<jd_count;j++){
        String checked=request.getParameter("check_jd"+j);
          list.add(checked);
      }
      QuestionDAO dao=DAOFactory.getQuestionDAO();
      synchronized(mutex1){
      Question question=dao.findQuestion(Long.valueOf(qid));
      String [] jdtz=question.getQJdtz().split("&");
      for(int j=0;j<jdtz.length;j++){
        if("on".equals(list.get(j)))
          jdtz[j]="over";
      }
      String newJdtz="";
      for(int j=0;j<jdtz.length;j++){
        if(j==jdtz.length-1)
          newJdtz=newJdtz+jdtz[j];
        else
          newJdtz=newJdtz+jdtz[j]+"&";
      }
      question.setQJdtz(newJdtz);
      boolean ret=dao.updateQuestion(question);
      if(ret==true)
        response.sendRedirect("../admin/OpResult.jsp?op=Question&ret=true&sid="+sid);
      else
        response.sendRedirect("../admin/OpResult.jsp?op=Question&ret=false");
      }
    }else if("setTZ".equals(op)){
      String sid=request.getParameter("sid");
      String qid=request.getParameter("qid");
      int jd_count=Integer.parseInt(request.getParameter("tz_count"));
      List<String> list=new ArrayList<String>();
      for(int j=0;j<jd_count;j++){
        String checked=request.getParameter("check_tz"+j);
          list.add(checked);
      }
      QuestionDAO dao=DAOFactory.getQuestionDAO();
      synchronized(mutex2){
      Question question=dao.findQuestion(Long.valueOf(qid));
      //set value of jdtz for every choice
      String [] jdtz=question.getQJdtz().split("&");
      for(int j=0;j<jdtz.length;j++){
        //System.out.println(list.get(j));
        if("on".equals(list.get(j))||list.get(j)==null){
          jdtz[j]="null";
        }else
          jdtz[j]=list.get(j);
      }
      //start concat the jdtz field with &.
      String newJdtz="";
      for(int j=0;j<jdtz.length;j++){
        if(j==jdtz.length-1)
          newJdtz=newJdtz+jdtz[j];
        else
          newJdtz=newJdtz+jdtz[j]+"&";
      }
      question.setQJdtz(newJdtz);
      boolean ret=dao.updateQuestion(question);
      if(ret==true)
        response.sendRedirect("../admin/OpResult.jsp?op=Question&ret=true&sid="+sid);
      else
        response.sendRedirect("../admin/OpResult.jsp?op=Question&ret=false");
    }
    }
  }
}
package com.ec.survey.ctrl;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ec.survey.dao.AnswersheetDAO;
import com.ec.survey.dao.DAOFactory;
import com.ec.survey.dao.QuestionDAO;
import com.ec.survey.dao.SurveyDAO;
import com.ec.survey.dao.TextDAO;
import com.ec.survey.dto.Survey;
public class SurveyManage extends HttpServlet {
  /**
   * 
   */
  private static final long serialVersionUID = -1737458302140188798L;
  /**
   * Constructor of the object.
   */
  public SurveyManage() {
    super();
  }
  /**
   * Destruction of the servlet. <br>
   */
  public void destroy() {
    super.destroy(); // Just puts "destroy" string in log
    // Put your code here
  }
  /**
   * The doGet method of the servlet. <br>
   *
   * This method is called when a form has its tag value method equals to get.
   * 
   * @param request the request send by the client to the server
   * @param response the response send by the server to the client
   * @throws ServletException if an error occurred
   * @throws IOException if an error occurred
   */
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    PrintWriter out=response.getWriter();
    String mutex1="";
    String mutex2="";
    if("AddSurvey".equals(request.getParameter("op"))){
      SurveyDAO surveydao=DAOFactory.getSurveyDAO(); 
      Survey survey=new Survey();
      survey.setSName(request.getParameter("Survey_name"));
      survey.setSAuthor(request.getParameter("Survey_author"));
      survey.setSDesc(request.getParameter("Survey_description"));
      survey.setSCreateDate(new Date());
      SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
      try {
        survey.setSExpireDate(sdf.parse(request.getParameter("Survey_ExpireDate")));
      } catch (ParseException e) {
         out.println("wrong DATE format.please check it!");
      }
      survey.setTemplet(0L);
      survey.setSIpRepeat(Boolean.valueOf(request.getParameter("Survey_ipRepeat")));
      survey.setSIsOpen(Boolean.valueOf(request.getParameter("Survey_isOpen")));
      if(request.getParameter("Survey_isImg")!=null)
        survey.setSImg(request.getParameter("imgfilepath"));
      if(request.getParameter("Survey_isPassword")!=null)
        survey.setSPassword(request.getParameter("Survey_Password1"));
      if(request.getParameter("Survry_IPLimit")!=null){
        //survey.setSIpLimitType(request.getParameter("Survey_ipLimitKinds"));
        survey.setSIpRange(request.getParameter("Survey_ipRange"));
      }
      survey.setSHits(0L);
      survey.setSIsAudited(false);
      survey.setSUsehits(0L);
      boolean ret=surveydao.addSurvey(survey);
      //System.out.println(ret);
      if(ret==true)
        response.sendRedirect("../admin/OpResult.jsp?op=SurveyAdd&ret=true");
      else
        response.sendRedirect("../admin/OpResult.jsp?op=SurveyAdd&ret=false");
    }
    else if("SurveyAudi".equals(request.getParameter("op"))){
      Boolean audit=Boolean.valueOf(request.getParameter("audit"));
      SurveyDAO surveydao=DAOFactory.getSurveyDAO();
      synchronized(mutex1){
      Survey  survey=surveydao.findSurvey(Long.valueOf(request.getParameter("sid")));
      if(audit==true)
        survey.setSIsAudited(true);
      else
        survey.setSIsAudited(false);
      boolean ret=surveydao.updateSurvey(survey);
      if(ret==true)
        response.sendRedirect("../admin/SurveyAudi.jsp");
      else
        response.sendRedirect("../admin/OpResult.jsp?op=SurveyAudi&ret=false");
      }
    }else if("EditSurvey".equals(request.getParameter("op"))){
      SurveyDAO surveydao=DAOFactory.getSurveyDAO(); 
      String sid=request.getParameter("Survey_id");
      synchronized(mutex2){
      Survey survey=surveydao.findSurvey(Long.valueOf(request.getParameter("Survey_id")));
      survey.setSName(request.getParameter("Survey_name"));
      survey.setSAuthor(request.getParameter("Survey_author"));
      survey.setSDesc(request.getParameter("Survey_description"));
      SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
      try {
        survey.setSExpireDate(sdf.parse(request.getParameter("Survey_ExpireDate")));
      } catch (ParseException e) {
         out.println("wrong DATE format.please check it!");
      }
      survey.setTemplet(0L);//?????幦??
      survey.setSIpRepeat(Boolean.valueOf(request.getParameter("Survey_ipRepeat")));
      survey.setSIsOpen(Boolean.valueOf(request.getParameter("Survey_isOpen")));
      if(request.getParameter("Survey_isImg")!=null){
        if(request.getParameter("imgfilepath")!=null)
        survey.setSImg(request.getParameter("imgfilepath"));
      }else
        survey.setSImg(null);
      //System.out.println(request.getParameter("Survey_isPassword"));
      if(request.getParameter("Survey_isPassword")!=null){
        survey.setSPassword(request.getParameter("Survey_isPassword"));
      }else
        survey.setSPassword(null);
      if(request.getParameter("Survry_IPLimit")!=null){
        //survey.setSIpLimitType(request.getParameter("Survey_ipLimitKinds"));
        survey.setSIpRange(request.getParameter("Survey_ipRange"));
        //System.out.print(request.getParameter("Survey_ipRange"));
      }else
      {
        survey.setSIpLimitType(null);
        survey.setSIpRange(null);
      }
      boolean ret=surveydao.updateSurvey(survey);
      //System.out.println(ret);
      if(ret==true)
        response.sendRedirect("../admin/SurveyEdit.jsp?sid="+sid+"&words="+URLEncoder.encode("操作成功!", "UTF-8"));
      else
        response.sendRedirect("../admin/OpResult.jsp?op=SurveyEdit&ret=false");
      }
    }else if("DelSurvey".equals(request.getParameter("op"))){
      Long surveyId=Long.valueOf(request.getParameter("sid"));
      SurveyDAO surveydao=DAOFactory.getSurveyDAO(); 
      boolean ret1=surveydao.delSurvey(surveyId);
      QuestionDAO questiondao=DAOFactory.getQuestionDAO();
      if(ret1==true)
        ret1=questiondao.delQuestions(surveyId);
      if(ret1==true){
        TextDAO tdao=DAOFactory.getTextDAO();
        ret1=tdao.delText(surveyId);
      }
      if(ret1==true){
        AnswersheetDAO adao=DAOFactory.getAnswersheetDAO();
        ret1=adao.delAnswersheets(surveyId);
      }
      if(ret1==true)
        response.sendRedirect("../admin/SurveyAdmin.jsp");
      else
        response.sendRedirect("../admin/OpResult.jsp?op=SurveyDel&ret=false");
    }
  }
  /**
   * The doPost method of the servlet. <br>
   *
   * This method is called when a form has its tag value method equals to post.
   * 
   * @param request the request send by the client to the server
   * @param response the response send by the server to the client
   * @throws ServletException if an error occurred
   * @throws IOException if an error occurred
   */
  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doGet(request,response);
  }
  /**
   * Initialization of the servlet. <br>
   *
   * @throws ServletException if an error occurs
   */
  public void init() throws ServletException {
    // Put your code here
  }
}
相关文章
|
5天前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
22 3
|
8天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
11 1
|
10天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
13天前
|
移动开发 前端开发 JavaScript
java家政系统成品源码的关键特点和技术应用
家政系统成品源码是已开发完成的家政服务管理软件,支持用户注册、登录、管理个人资料,家政人员信息管理,服务项目分类,订单与预约管理,支付集成,评价与反馈,地图定位等功能。适用于各种规模的家政服务公司,采用uniapp、SpringBoot、MySQL等技术栈,确保高效管理和优质用户体验。
|
15天前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
40 1
|
19天前
|
Java 关系型数据库 API
介绍一款Java开发的企业接口管理系统和开放平台
YesApi接口管理平台Java版,基于Spring Boot、Vue.js等技术,提供API接口的快速研发、管理、开放及收费等功能,支持多数据库、Docker部署,适用于企业级PaaS和SaaS平台的二次开发与搭建。
|
23天前
|
前端开发 Java 数据库连接
基于Java的校车管理系统(下)
基于Java的校车管理系统(下)
16 0
|
12天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
91 38
|
9天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
4天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####