jakarta ee Java:Java ee应用程序中的静态和线程安全
我想知道在JavaEE应用程序中使用静态方法的含义是什么
例如:有一个类处理日期转换、字符串重新排序等操作。
这个类中的所有方法都是静态的
这些方法由servlet使用
这是否意味着静态方法需要是线程安全的(如果多个用户同时使用应用程序并且同时访问静态方法,那么可能会出现一些问题)
编辑我想在web应用程序的上下文中了解这一点-两个用户是否会同时使用静态方法并相互干扰(静态方法的结果)
你可以在下面搜索框中键入要查询的问题!
我想知道在JavaEE应用程序中使用静态方法的含义是什么
例如:有一个类处理日期转换、字符串重新排序等操作。
这个类中的所有方法都是静态的
这些方法由servlet使用
这是否意味着静态方法需要是线程安全的(如果多个用户同时使用应用程序并且同时访问静态方法,那么可能会出现一些问题)
编辑我想在web应用程序的上下文中了解这一点-两个用户是否会同时使用静态方法并相互干扰(静态方法的结果)
# 1 楼答案
只有当存在共享状态时。如果要为每次调用在堆上分配新对象,那么这不是问题
但我从来都不喜欢做这种事情,因为引入共享状态立即意味着你有线程安全问题。我更喜欢创建转换器/助手类的实例(对象创建通常在性能方面可以忽略不计)。这立即意味着您是线程安全的(前提是您不共享状态),每个实例都可以(例如)在构造时进行定制,以便在需要时提供不同的行为
# 2 楼答案
只要没有共享的类变量,并行访问这些方法是可以的;e、 g.如果该方法声明了自己的内容,那么您就很好:
以上是好的
这个不是
# 3 楼答案
当然,如果你不保护你的静态方法,并且它们改变了a状态,就会出现问题
考虑此样本
如果有多个线程调用
increment
,则可能会丢失一些增量(即count
小于调用增量方法的次数)因此,必须将方法设置为已同步:
如果您认为自己没有共享状态,请小心:许多标准类(例如SimpleDateFormat,正如您所说的日期格式)不是线程安全的,如果同时从多个线程调用实例,则可能会失败
因此,一旦有一个静态实例从多个线程访问,就要非常小心