假设我有一个名为 doSomething()
的方法,并且我想在多线程应用程序中使用此方法(每个 servlet 都继承自 HttpServlet)。我想知道是否有可能出现竞争在以下情况下会发生这种情况:
doSomething()
是不是静态方法,它将值写入数据库。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/