jsp/servlet 应用程序中的 java 方法和竞争条件

标签 java multithreading servlets race-condition

假设我有一个名为 doSomething() 的方法,并且我想在多线程应用程序中使用此方法(每个 servlet 都继承自 HttpServlet)。我想知道是否有可能出现竞争在以下情况下会发生这种情况:

  1. doSomething()不是静态方法,它将值写入数据库。
  2. doSomething()静态方法,但它不会将值写入数据库。

我注意到我的应用程序中的许多方法可能会导致竞争条件或脏读/写。例如,我有一个投票系统,对于每个投票操作,某种方法将更改该投票的单个单元格值,如下所示:

[poll_id |              poll_data        ]
[1       | {choice_1 : 10, choice_2 : 20}]

JSP/Servlet 应用程序会自行解决这些问题,还是我必须自己解决所有这些问题?

谢谢..

最佳答案

这取决于 doSomething() 的实现方式以及它实际执行的操作。我假设写入数据库使用 JDBC 连接,这是线程安全的。首选的方法是创建 ThreadLocal JDBC 连接。

至于第二种情况,取决于方法中发生了什么。如果它不访问任何共享的可变状态,那么就不存在问题。如果确实如此,您可能需要适当锁定,这可能涉及向这些变量的所有其他访问添加锁定。

(请注意,仅将这些方法标记为 synchronized 并不能修复任何并发错误。如果 doSomething() 递增共享对象上的值,则所有访问该变量需要同步,因为i++不是原子操作。如果它像递增计数器一样简单,您可以使用AtomicInteger.incrementAndGet() .)

关于jsp/servlet 应用程序中的 java 方法和竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2767841/

相关文章:

java - jackson JodaTime DateTime 未序列化

.net - 如何本地化应用程序中所有线程的字符串资源查找?

c# - 如何在 lambda 表达式中传递 ref 参数? - 线程问题

java - 在 2 个子域之间共享 session 数据

jsp - tomcat 服务缓存别名

java - 以增量方式显示数据库查询结果

java - 比较 2 个 ArrayList<HashMap<String, String>> 之间的字符串

java - 用于生产的外部容器中的 Spring Boot 嵌入式容器或 war 文件

java - 如何使用 Wix 创建 Java 应用程序的快捷方式

c++ - 从不同的线程、不同的函数写入(登录)同一个文件?